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

Flutter中SQLite数据库文件的正确跨平台放置位置

Flutter双平台加载预存SQLite数据库的正确方案

你的assets文件放置位置是正确的(根目录下assets/db/myDB.db,与lib同级),问题出在你没有将assets里的只读数据库复制到应用的可读写沙箱目录,直接调用openDatabase('myDb.db')会在应用沙箱里创建一个全新的空数据库,这就是查询报错、甚至输入不存在的库名也不会报错的原因(sqflite会自动创建空库)。

正确实现步骤

  1. 添加依赖包
    在pubspec.yaml中添加sqflite和path_provider(用于获取应用可读写目录):

    dependencies:
      flutter:
        sdk: flutter
      sqflite: ^2.3.0
      path_provider: ^2.1.1
    
  2. 编写数据库初始化工具函数
    实现从assets复制数据库到可读写目录的逻辑:

    import 'dart:io';
    import 'package:path/path.dart';
    import 'package:sqflite/sqflite.dart';
    import 'package:path_provider/path_provider.dart';
    import 'package:flutter/services.dart';
    
    Future<Database> initDatabase() async {
      // 获取应用的可读写文档目录
      Directory documentsDir = await getApplicationDocumentsDirectory();
      String dbPath = join(documentsDir.path, 'myDB.db');
    
      // 检查目标位置是否已存在数据库文件
      bool dbExists = await File(dbPath).exists();
      if (!dbExists) {
        // 从assets读取数据库文件并复制到目标路径
        ByteData assetData = await rootBundle.load(join('assets/db', 'myDB.db'));
        List<int> bytes = assetData.buffer.asUint8List(
          assetData.offsetInBytes,
          assetData.lengthInBytes
        );
        await File(dbPath).writeAsBytes(bytes, flush: true);
      }
    
      // 打开复制后的数据库
      return await openDatabase(dbPath);
    }
    
  3. 修改数据库调用逻辑
    使用上面的初始化函数替代直接调用openDatabase:

    final db = await initDatabase();
    final List<Map<String, dynamic>> maps = await db.rawQuery(
      'SELECT * FROM mytable WHERE module_id = ?', 
      [moduleId]
    );
    

关键注意事项

  • 文件名大小写统一:你的assets文件是myDB.db,但之前代码里用的是myDb.db,iOS系统区分文件名大小写,必须保持一致。
  • assets配置验证:你当前pubspec.yaml里的assets: - assets/db/配置是正确的,会包含该目录下的所有文件,无需修改。
  • 异常处理:可以在复制数据库的逻辑中添加try-catch,处理文件读取或复制失败的情况,避免崩溃。

内容的提问来源于stack exchange,提问作者user1052610

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 22:11:18