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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 18:54:20