You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 13:06:05