Flutter加载现有SQFlite数据库提示no such table错误如何解决
问题修复方案
核心问题
你当前代码的_onCreate回调仅加载了assets内的预置数据库资源,但没有将资源写入到应用文档目录的目标路径,openDatabase实际打开的是新建的空数据库文件,因此查询时会提示找不到Links表。
修复代码
替换你的_initDatabase方法为如下实现,原有_onCreate方法可以直接删除:
Future<Database> _initDatabase() async { Directory documentsDirectory = await getApplicationDocumentsDirectory(); String path = join(documentsDirectory.path, 'DSA_Database.db'); // 检测目标路径是否已存在数据库文件 if (!await File(path).exists()) { // 从assets加载预置数据库 ByteData dbAsset = await rootBundle.load(join('assets', 'DSA_Database.db')); List<int> dbBytes = dbAsset.buffer.asUint8List(dbAsset.offsetInBytes, dbAsset.lengthInBytes); // 将数据库写入目标路径 await File(path).writeAsBytes(dbBytes); } // 直接打开已存在的预置数据库 return await openDatabase(path, version: 1); }
调试注意事项
- 修改代码后先卸载应用或者清除应用存储数据,避免之前生成的空数据库文件缓存影响验证
- 用SQLite可视化工具打开本地
assets/DSA_Database.db文件,确认Links表确实存在且拼写大小写匹配 - 确认pubspec.yaml中配置的assets路径和实际文件路径大小写完全一致
内容的提问来源于stack exchange,提问作者EisGlockner
相关产品推荐
相关产品推荐

