如何在Flutter中使用Floor加载Assets中的预填充数据库?
在Flutter中使用Floor加载Assets预填充数据库的解决步骤
1. 准备预填充数据库文件
将你的.db数据库文件放到项目的assets/database/目录下(无此目录则新建),然后在pubspec.yaml中配置资源路径:
flutter: assets: - assets/database/your_preloaded_db.db
2. 添加依赖
在pubspec.yaml中添加必要的依赖包:
dependencies: floor: ^1.4.2 path_provider: ^2.0.15 sqflite: ^2.3.0 dev_dependencies: floor_generator: ^1.4.2 build_runner: ^2.4.4
3. 复制Assets数据库到可读写路径
Assets中的文件是只读的,需要先把数据库复制到应用的文档目录。创建一个工具方法:
import 'dart:io'; import 'package:flutter/services.dart'; import 'package:path/path.dart'; import 'package:path_provider/path_provider.dart'; Future<File> copyPreloadedDb() async { final documentsDir = await getApplicationDocumentsDirectory(); final dbPath = join(documentsDir.path, 'your_preloaded_db.db'); // 数据库已存在则直接返回 if (await File(dbPath).exists()) { return File(dbPath); } // 从Assets复制数据库文件 final byteData = await rootBundle.load('assets/database/your_preloaded_db.db'); final buffer = byteData.buffer; await File(dbPath).writeAsBytes( buffer.asUint8List(byteData.offsetInBytes, byteData.lengthInBytes), ); return File(dbPath); }
4. 配置Floor数据库连接
修改你的Floor数据库类,使用复制后的数据库路径初始化:
import 'package:floor/floor.dart'; // 示例实体类(需和预填充数据库表结构完全匹配) @entity class User { @primaryKey final int id; final String name; User(this.id, this.name); } // 示例DAO @dao abstract class UserDao { @Query('SELECT * FROM User') Future<List<User>> getAllUsers(); } // 数据库类 @Database(version: 1, entities: [User]) abstract class AppDatabase extends FloorDatabase { UserDao get userDao; // 自定义初始化方法 static Future<AppDatabase> initialize() async { final dbFile = await copyPreloadedDb(); return $FloorAppDatabase.databaseBuilder(dbFile.path).build(); } }
5. 初始化并使用数据库
在应用启动时初始化数据库,之后就可以正常调用DAO方法:
import 'package:flutter/material.dart'; void main() async { WidgetsFlutterBinding.ensureInitialized(); final db = await AppDatabase.initialize(); // 测试读取预填充数据 final users = await db.userDao.getAllUsers(); print('预填充用户数据:$users'); runApp(const MyApp()); } class MyApp extends StatelessWidget { const MyApp({super.key}); @override Widget build(BuildContext context) { return MaterialApp( home: Scaffold( appBar: AppBar(title: const Text('Floor预填充数据库示例')), ), ); } }
注意事项
- 确保预填充数据库的表名、字段名、数据类型和你定义的Floor实体类完全一致,否则会出现查询异常。
- 数据库版本号要和预填充数据库的版本匹配,后续需要更新数据库时,要编写对应的迁移逻辑。
- 执行
flutter pub get后,记得运行flutter packages pub run build_runner build生成Floor的相关代码。
内容的提问来源于stack exchange,提问作者Alenparish
相关产品推荐
相关产品推荐

