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

如何将预填充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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 13:06:23