database - 如何解决 flutter sqlite 语法错误?

标签 database sqlite flutter dart syntax

双 我用sqlite做数据库 我在构建数据库时遇到了问题。

我的屏幕完整代码:

import 'dart:async';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'dart:math';
import 'package:socialapp/model/todo.dart';
import 'package:socialapp/widgets/database_create.dart';



class writeprofile2 extends StatefulWidget {
  writeprofile2({Key key}) : super(key : key);

  @override
  _writeprofile2State createState() => _writeprofile2State();
}

class _writeprofile2State extends State<writeprofile2> {

  final _formKey = GlobalKey<FormState>();
  String _name, _age, _intro;


  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Builder(
        builder: (context) => Center(
          child: Container(
            child: Container(
              child: Form(
                key: _formKey,
                child: Column(
                  children: <Widget>[
                    Padding(
                      padding: EdgeInsets.only(top: 70),
                      child: Text(
                        '프로필 작성',
                        style: TextStyle(
                          fontSize: 30,
                          fontWeight: FontWeight.w500,
                        ),
                      ),
                    ),
                    Padding(
                      padding: EdgeInsets.only(top: 10, bottom: 50),
                      child: Container(
                        height: 1,
                        width: MediaQuery.of(context).size.width / 1.4,
                        color: Colors.black26,
                      ),
                    ),
                    Padding(
                      padding: EdgeInsets.only(top: 10),
                      child: Container(
                        //이름입력
                        width: MediaQuery.of(context).size.width / 2,
                        height: MediaQuery.of(context).size.height / 20,
                        alignment: FractionalOffset.center,
                        decoration: BoxDecoration(
                          color: Colors.black12,
                          borderRadius:
                          BorderRadius.all(const Radius.circular(20)),
                        ),
                        child: TextFormField(
                          decoration: InputDecoration(
                            hintStyle: TextStyle(
                              fontSize: 20,
                            ),
                            border: InputBorder.none,
                            hintText: '이름',
                            prefixIcon: Icon(
                              Icons.person_outline,
                              color: Colors.black,
                            ),
                          ),
                          validator: (input) {
                            if (input.isEmpty) {
                              return '이름을 입력해주세요';
                            }
                          },
                          onSaved: (value)=> _name = value,
                        ),
                      ),
                    ),
                    Padding(
                      padding: EdgeInsets.only(top: 10),
                      child: Container(
                        width: MediaQuery.of(context).size.width / 2,
                        height: MediaQuery.of(context).size.height / 20,
                        alignment: FractionalOffset.center,
                        decoration: BoxDecoration(
                          color: Colors.black12,
                          borderRadius:
                          BorderRadius.all(const Radius.circular(20)),
                        ),
                        child: TextFormField(
                          keyboardType: TextInputType.number,
                          inputFormatters: [
                            WhitelistingTextInputFormatter.digitsOnly
                          ],
                          decoration: InputDecoration(
                            hintStyle: TextStyle(
                              fontSize: 20,
                            ),
                            border: InputBorder.none,
                            hintText: '나이',
                            prefixIcon: Icon(
                              Icons.label_outline,
                              color: Colors.black,
                            ),
                          ),
                          validator: (val) {
                            if (!isNumber(val)) {
                              return "나이를 입력해주세요";
                            };
                          },
                          onSaved: (value)=> _age = value,
                        ),
                      ),
                    ),
                    Padding(
                      padding: EdgeInsets.only(top: 10),
                      child: Container(
                        //이름입력
                        width: MediaQuery.of(context).size.width / 2,
                        height: MediaQuery.of(context).size.height / 20,
                        alignment: FractionalOffset.center,
                        decoration: BoxDecoration(
                          color: Colors.black12,
                          borderRadius:
                          BorderRadius.all(const Radius.circular(20)),
                        ),
                        child: TextFormField(
                          decoration: InputDecoration(
                            hintStyle: TextStyle(
                              fontSize: 20,
                            ),
                            border: InputBorder.none,
                            hintText: '소개',
                            prefixIcon: Icon(
                              Icons.person_outline,
                              color: Colors.black,
                            ),
                          ),
                          validator: (input) {
                            if (input.isEmpty) {
                              return '자기소개';
                            }
                          },
                          onSaved: (value)=> _intro = value,
                        ),
                      ),
                    ),
                    InkWell(
                      onTap: (){
                        Todo newtodo = Todo(name: _name, age: _age, intro: _intro);
                        DBHelper().createData(newtodo);
                        setState(() {
                        });
                      },
                      child: Padding(
                        padding: EdgeInsets.only(top: 50),
                        child: Container(
                          width: MediaQuery.of(context).size.width / 3,
                          height: MediaQuery.of(context).size.height / 20,
                          alignment: FractionalOffset.center,
                          decoration: BoxDecoration(
                            color: const Color.fromRGBO(250, 80, 100, 1),
                            borderRadius:
                            BorderRadius.all(const Radius.circular(30)),
                          ),
                          child: Text(
                            "Next",
                            style: TextStyle(
                              color: Colors.white,
                              fontSize: 20,
                              fontWeight: FontWeight.w500,
                              letterSpacing: 0.3,
                            ),
                          ),
                        ),
                      ),
                    ),
                  ],
                ),
              ),
            ),
          ),
        ),
      ),
    );
  }

  String randomTodo(){
    final randomNumber = Random().nextInt(4);
    String todo;
    switch(randomNumber){
      case 1:
        todo = 'hello1';
        break;
      case 1:
        todo = 'hello2';
        break;
      case 1:
        todo = 'hello3';
        break;
      default:
        todo = 'default';
        break;
    }
    return todo;
  }
}

bool isNumber(String valueNumber) {
  if (valueNumber == null) {
    return true;
  }
  final n = num.tryParse(valueNumber);
  return n != null;
}

我的待办事项代码:



class Todo {
  int id;
  String name;
  String intro;
  String age;

  Todo({
    this.id,
    this.name,
    this.intro,
    this.age,});

  factory Todo.fromJson(Map<String, dynamic> json) => Todo(
    id: json["id"],
    intro: json["intro"],
    name: json["name"],
    age: json["age"],
  );

  Map<String, dynamic> toJson() =>
      {
        'id' :id,
        'name': name,
        'age': age,
        'intro' : intro,
      };

}

该数据库创建代码:

import 'package:path_provider/path_provider.dart';
import 'package:sqflite/sqflite.dart';
import 'package:socialapp/model/todo.dart';
import 'dart:async';
import 'dart:io';
import 'package:path/path.dart';


final String tableName = 'person';

class DBHelper{
  DBHelper._();
  static final DBHelper _db = DBHelper._();
  factory DBHelper() => _db;

  //해당 변수에 데이터베이스 정보 저장
  static Database _database;

  Future<Database> get database async{
    if(_database != null)return _database;

    _database = await initDB();
    return _database;
  }


  initDB() async{
    Directory documentsDirectory = await getApplicationDocumentsDirectory();
    String path = join(documentsDirectory.path, 'PersonProfile.db');

    return await openDatabase(
      path,
      version: 1,
      onOpen: (db) {},
      onCreate: (Database db, int version) async{
        await db.execute('''
        CREATE TABLE $tableName
        id INTEGER PRIMARY KEY,
        name TEXT,
        intro TEXT,
        age TEXT ''');
      },
    );
  }


  createData(Todo todo)async{
    final db = await database;
    var res = await db.insert(tableName, todo.toJson());
    return res;
  }

  //read
  getTodo(int id) async{
    final db = await database;
    var res = await db.query(tableName, where: 'id = ?', whereArgs: [id]);
    return res.isNotEmpty ? Todo.fromJson(res.first) : Null;
  }

//  getAllTodos() async{
//    final db = await database;
//    var res = await db.query(tableNam
//  }
  updateTodo(Todo todo) async{
    final db = await database;
    var res = await db.update(tableName, todo.toJson(),
    where: 'id =?' , whereArgs: [todo.id]);
    return res;
  }

  //Delete
  deleteTodo(int id) async{
    final db = await database;
    db.delete(tableName, where: 'id =?', whereArgs: [id]);
  }

  deleteAllTodos() async{
    final db =await database;
    db.rawDelete("Delete * from $tableName");
  }
}



error code :

> 
> 
>     id INTEGER PRIMARY KEY,
>         name TEXT,
>         intro TEXT,
>         age TEXT flutter: error DatabaseException(Error Domain=FMDatabase Code=1 "near "id": syntax error"
> UserInfo={NSLocalizedDescription=near "id": syntax error}) sql '      
> CREATE TABLE person
>         id INTEGER PRIMARY KEY,
>         name TEXT,
>         intro TEXT,
>         age TEXT ' args []} during open, closing... [VERBOSE-2:ui_dart_state.cc(148)] Unhandled Exception:
> DatabaseException(Error Domain=FMDatabase Code=1 "near "id": syntax
> error" UserInfo={NSLocalizedDescription=near "id": syntax error}) sql
> '        CREATE TABLE person
>         id INTEGER PRIMARY KEY,
>         name TEXT,
>         intro TEXT,
>         age TEXT ' args []}
> #0      wrapDatabaseException (package:sqflite/src/exception_impl.dart:11:7) <asynchronous
> suspension>
> #1      SqfliteDatabaseFactoryImpl.wrapDatabaseException (package:sqflite/src/factory_impl.dart:29:7)
> #2      SqfliteDatabaseMixin.safeInvokeMethod (package:sqflite/src/database_mixin.dart:184:15)
> #3      SqfliteDatabaseMixin.invokeExecute (package:sqflite/src/database_mixin.dart:342:12)
> #4      SqfliteDatabaseMixin.txnExecute.<anonymous closure> (package:sqflite/src/database_mixin.dart:334:14)
> #5      SqfliteDatabaseMixin.txnSynchronized (package:sqflite/src/database_mixin.dart:285:26) <asynchronous
> suspension>
> #6      SqfliteDatabaseMixin.txnWriteSynchronized (package:sqflite/src/da<…>




How can i fix this ? 


最佳答案

需要在表名后加括号:

 CREATE TABLE $tableName(
        id INTEGER PRIMARY KEY,
        name TEXT,
        intro TEXT,
        age TEXT)

在这里查看:

http://www.mysqltutorial.org/mysql-create-table/

同时检查 sqflite 中的示例插件:

  await db.execute(
      'CREATE TABLE Test (id INTEGER PRIMARY KEY, name TEXT, value INTEGER, num REAL)');
});

关于database - 如何解决 flutter sqlite 语法错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58115283/

相关文章:

sql - 无法在输出选择中切换列

iphone - 将日期保存到 SQLite

dart - 弹出第二页后触发FirstPage的setState方法

javascript - 如何将 'this' 从 A 类传递到 B 类?

MySQL - 替换列值

c# - 一张表中的一条记录与另一张表中的多条记录之间的关系

java - Tomcat 和 mySQL 配置

用于聊天应用程序的 Android 数据库加载聊天

firebase - 如何在 Flutter 中使用 Firebase 更改密码

mysql - 查询表中的所有数据,仅连接连接表中的最新记录