Flutter使用sqflite创建数据库报错:找不到plus表
解决sqflite中"no such table:plus"的错误
常见原因及修复方法
1. 数据库已存在,onCreate未触发
onCreate回调仅在数据库文件首次创建时执行,如果之前运行应用时未创建plus表,后续打开数据库不会再执行该回调。
修复方案:
- 卸载应用后重新运行,让数据库重新创建,onCreate会执行建表语句。
- 或者通过
onUpgrade补建表:
修改openDatabase配置,提升版本号,在onUpgrade中确保表存在:db = await openDatabase( join(await getDatabasesPath(), 'data.db'), onCreate: (db, version) async{ await db.execute("CREATE TABLE IF NOT EXISTS plus(point INTEGER, goal TEXT);"); await db.execute("CREATE TABLE IF NOT EXISTS minus(point INTEGER, goal TEXT);"); }, onUpgrade: (db, oldVersion, newVersion) async { await db.execute("CREATE TABLE IF NOT EXISTS plus(point INTEGER, goal TEXT);"); await db.execute("CREATE TABLE IF NOT EXISTS minus(point INTEGER, goal TEXT);"); }, version: 2, // 将版本号从1改为2 );
2. 数据库初始化未完成就执行insert
initState里用Future(() async {})初始化数据库是异步操作,可能在数据库还没完成建表时就调用了db.insert,导致表不存在的错误。
修复方案:
- 确保数据库初始化完成后再执行操作,比如标记初始化状态:
bool _dbReady = false; @override void initState() { super.initState(); _initDB(); } Future<void> _initDB() async { db = await openDatabase( join(await getDatabasesPath(), 'data.db'), onCreate: (db, version) async{ await db.execute("CREATE TABLE IF NOT EXISTS plus(point INTEGER, goal TEXT);"); await db.execute("CREATE TABLE IF NOT EXISTS minus(point INTEGER, goal TEXT);"); }, version: 1, ); setState(() { _dbReady = true; }); print("done"); } // 执行insert前先判断状态 if (_dbReady) { await db.insert('plus', { "point": Provider.of<ProvDatas>(context, listen: false).point_plus, "goal": Provider.of<ProvDatas>(context, listen: false).text_plus }); }
3. 检查SQL建表语句
确认建表语句语法无误:字段类型、名称、末尾分号都要正确,比如point INTEGER和goal TEXT都是sqflite支持的合法类型。
内容的提问来源于stack exchange,提问作者tasmicsy
相关产品推荐
相关产品推荐

