繁体   English   中英

flutter: sqflite 插入错误,“数据类型不匹配”

[英]flutter: sqflite insert error, "datatype mismatch"

CREATE 成功运行,但 INSERT 不起作用。 我认为 INSERT 的 arguments 是正确的......但为什么呢?

(09.09修改)问题是字符串输入参数的类别问题。

Docker)插入任务(类别)值(?)args [walking(X)/'walking'(O)/“walking”(O)]

颤振)插入任务(类别)值(?)args [walking(X)/'walking'(X)/“walking”(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]

但是,INSERT SQL 在 docker 的 sqlite 中工作。

docker 中的 sqlite

在 docker 中,SQL 成功地工作,但不能与 sqflite、Flutter 一起工作。 我应该怎么办?

Quest的class就在这里。

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);

请帮助我......我为这个问题苦苦挣扎了好几天,但我无法解决它。

通过以下方式解决问题

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 表,但属性与我想要创建的不同。 所以我放弃并重新创建它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM