sqlite Ffltter:SQFlite插入错误,“数据类型不匹配”

uoifb46i  于 2022-11-15  发布在  SQLite
关注(0)|答案(1)|浏览(189)

Create成功运行,但Insert不运行。我认为插入的论点是正确的..。但是为什么呢?
(09.09修改)问题是字符串输入参数的类别问题。
Docker)插入到Quest(类别)值(?)参数[行走(X)/‘行走’(O)/‘行走’(O)]
颤动)插入到任务(类别)值(?)参数[行走(X)/‘行走’(X)/‘行走’(X)]

flutter: CREATE TABLE Quest ( 
    id INTEGER PRIMARY KEY AUTOINCREMENT, 
    category TEXT, 
    level INTEGER, 
    need_token INTEGER, 
    reward_token INTEGER,
    start_date TIMESTAMP, 
    finish_date TIMESTAMP, 
    achieve_date TIMESTAMP, 
    goal INTEGER, 
    need_times INTEGER, 
    achievement INTEGER
)

flutter: DatabaseException(
    Error Domain=FMDatabase Code=20 "datatype mismatch" 
    UserInfo={NSLocalizedDescription=datatype mismatch}
) sql 'INSERT OR REPLACE INTO Quest (
    category, 
    level, 
    need_token, 
    reward_token, 
    start_date, 
    finish_date, 
    achieve_date, 
    goal, need_times, 
    achievement
) VALUES (?, ?, ?, ?, ?, ?, NULL, ?, ?, ?)' 
args ['walking', 0, 0, 1, 1662658696748, 1662745096748, 100, 1, 0]

但是,插入的SQL在docker的SQLite中工作。
sqlite in docker
在docker中,SQL成功地工作了,但不能与Sqflite、Ffltter一起工作。我该怎么办?
任务的班级来了。

class Quest {
  String category;
  int level;
  int needToken;
  int rewardToken;
  DateTime startDate;
  DateTime finishDate;
  DateTime? achieveDate;
  int goal;
  int needTimes;
  int achievement;

  ...

  Map<String, dynamic> toDBData() => {
    'category': "'$category'",
    'level': level,
    'need_token': needToken,
    'reward_token': rewardToken,
    'start_date': startDate.millisecondsSinceEpoch,
    'finish_date': finishDate.millisecondsSinceEpoch,
    'achieve_date': achieveDate?.millisecondsSinceEpoch,
    'goal': goal,
    'need_times': needTimes,
    'achievement': achievement
  };
}
Future<void> insertQuest(Quest quest) async =>
      await dbHelper.insert(_tableName, quest.toDBData());
Future<void> insert(String table, Map<String, dynamic> data) async => await db!
            .insert(table, data, conflictAlgorithm: ConflictAlgorithm.replace);

请帮帮我。我为解决这个问题苦苦挣扎了好几天,但我还是解决不了。

bhmjp9jg

bhmjp9jg1#

通过以下方式解决问题

db = await openDatabase(path, version: 1,
          onCreate: (Database db, int version) async {
        await db
            .execute(statement..trim().replaceAll(RegExp(r'[\s]{2,}'), ' '));
      }, 
          // add 'CREATE TABLE IF NOT EXISTS TABLE' SQL to onOpen function.
          onOpen: (Database db) async {
        // await db.execute("DROP TABLE $tableName);
        await db
            .execute(statement..trim().replaceAll(RegExp(r'[\s]{2,}'), ' '));
      });

问题是已经创建了Quest表,但属性与我想要创建的属性不同。所以我放弃并重新创造了它。

相关问题