[英]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 中,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.