如何将预填充Realm数据库与Flutter应用一同安装到移动设备?
解决Flutter预填充Realm数据库同步问题
要让预填充的Realm数据库和应用一同安装到设备,需要完成资源文件配置和启动时复制逻辑两个核心步骤,以下是分平台的具体操作:
1. 准备预填充数据库文件
确保你的预填充Realm文件(比如命名为prepopulated.realm)是已完成数据填充的有效Realm格式文件。
2. 分平台配置资源文件
Android平台
- 在
android/app/src/main/目录下新建assets文件夹(如果不存在)。 - 将预填充的
.realm文件放入assets目录,Flutter打包时会自动将该目录下的文件纳入安装包。
iOS平台
- 打开iOS项目(
ios/Runner.xcworkspace),右键点击Runner目录,选择Add Files to "Runner"。 - 选中你的预填充
.realm文件,勾选Copy items if needed,并确保Add to targets选中Runner。 - 前往
Build Phases > Copy Bundle Resources,确认该文件已在列表中。
3. 代码实现启动时复制逻辑
在应用启动阶段,检查Realm默认存储路径下是否存在数据库文件,若不存在则从资源包中复制过去:
import 'dart:io'; import 'package:flutter/services.dart'; import 'package:path/path.dart'; import 'package:realm/realm.dart'; import 'package:flutter/material.dart'; Future<void> copyPrepopulatedRealm() async { // 获取Realm默认存储路径 final targetPath = Realm.defaultPath; final targetFile = File(targetPath); // 数据库已存在则跳过复制 if (await targetFile.exists()) return; // 确保目标目录存在 await targetFile.parent.create(recursive: true); // 从资源包读取文件并写入目标路径 final assetByteData = await rootBundle.load('assets/prepopulated.realm'); await targetFile.writeAsBytes( assetByteData.buffer.asUint8List( assetByteData.offsetInBytes, assetByteData.lengthInBytes, ), ); } void main() async { WidgetsFlutterBinding.ensureInitialized(); // 先执行复制操作再启动应用 await copyPrepopulatedRealm(); runApp(const MyApp()); }
注意事项
- 替换代码中的
assets/prepopulated.realm为你实际的文件路径和名称。 - 确保预填充数据库的Realm版本与项目依赖的Realm版本兼容,避免出现数据库无法打开的问题。
- 测试前建议先卸载设备上的旧应用,确保复制逻辑能触发。
内容的提问来源于stack exchange,提问作者Amani
相关产品推荐
相关产品推荐

