如何使用预填充的Realm数据库交付应用程序

29

我想在我的领域数据库中使用预填充数据来交付我的应用程序。我只需要将其简单复制到文档目录中吗?还是还有其他事情要做?


Android / iOS 或者两者都支持? - caulitomaz
iOS - 有什么区别吗? - swalkner
是的。@jpsim为您提供了iOS(Objective-C)的文档链接。https://dev59.com/ooTba4cB1Zd3GeqP0g7k则指向了更跨平台的解决方案,使用Realm.getInstance()来读取*.realm文件。 - caulitomaz
3个回答

32

Realm的文档中有一节关于"将Realm与应用程序捆绑在一起":

常见的做法是在应用程序中添加初始数据,使其在用户首次启动时立即可用。以下是如何实现此操作:
1. 首先,填充 Realm。您应该使用与最终发布的应用程序相同的数据模型来创建一个 Realm,并使用要打包到应用程序中的数据进行填充。由于 Realm 文件是跨平台的,因此您可以使用 OS X 应用程序(请参阅我们的 JSONImport 示例)或在模拟器中运行的 iOS 应用程序。
2. 在生成此 Realm 文件的代码中,应通过制作一个压缩副本(请参阅-[RLMRealm writeCopyToPath:error:])来完成。这将减小 Realm 文件的大小,使您的最终应用程序更轻便,方便用户下载。
3. 将新的压缩副本拖动到最终应用程序的 Xcode 项目导航器中。
4. 在 Xcode 中转到应用程序目标的构建阶段选项卡,并将 Realm 文件添加到“复制包资源”构建阶段中。
5. 此时,您的打包 Realm 文件将可供应用程序使用。您可以使用[[NSBundle mainBundle] pathForResource:ofType:]查找其路径。
6. 您可以通过调用[RLMRealm realmWithPath:readOnly:error:]创建只读 Realm。或者,如果您想基于此初始数据创建可写的 Realm 文件,则可以使用[[NSFileManager defaultManager] copyItemAtPath:toPath:error:]将打包的文件复制到应用程序的文档目录中,然后使用[RLMRealm realmWithPath:]构建新的 Realm。
您可以参考我们的 migration sample app 示例来了解如何使用打包的 Realm 文件。

3
Android的说明文档在这方面怎么样?Java的文档中缺少类似的部分。 - caulitomaz
3
您可以在此处查看如何打包Realm文件的示例:https://github.com/realm/realm-java/blob/master/examples/migrationExample/src/main/java/io/realm/examples/realmmigrationexample/MigrationExampleActivity.java。 - Christian Melchior
1
请查看我的答案,了解在Realm Android中添加初始数据的支持方式。 - Jade
一个.realm文件和一个.json文件的相对大小是多少?我已经直接使用JSON填充了Realm,所以我想知道是否值得将它们转换为.realm文件。 - ono
如果你的JSON文件很大,我几乎可以保证将其转换为Realm(并压缩该Realm)将产生一个明显更小的文件,并且你将避免在应用程序启动时反序列化JSON并写入数据库的性能成本。 - jpsim
显示剩余3条评论

4

为Android预填充Realm数据库

将您的Realm数据库放入res/raw文件夹中

并在活动中执行以下代码:

// 复制Realm数据库

copyBundledRealmFile(this.getResources().openRawResource(R.raw.default0), "default0.realm");

RealmConfiguration config0 = new RealmConfiguration.Builder()
            .name("default0.realm")
            .build();

realm = Realm.getInstance(config0);

private String copyBundledRealmFile(InputStream inputStream, String outFileName) {
    try {
        File file = new File(this.getFilesDir(), outFileName);
        FileOutputStream outputStream = new FileOutputStream(file);
        byte[] buf = new byte[1024];
        int bytesRead;
        while ((bytesRead = inputStream.read(buf)) > 0) {
            outputStream.write(buf, 0, bytesRead);
        }
        outputStream.close();
        return file.getAbsolutePath();
    } catch (IOException e) {
        e.printStackTrace();
    }
    return null;
}

0
一个更简单的方法是创建一个即席函数,仅在领域模型(例如此示例中的“MyModel”)上没有数据时调用,在首次应用程序启动时:
let realm = try! Realm()
lazy var data: Results<MyModel> = { self.realm.objects(MyModel.self) }()    

func populateDefaultData() {
    
    if yourdata.count == 0 {
        
        try! realm.write() {
            let defaultData = ["Data1", "Data2", "Data3"]
            for data in defaultData {
                let newData = MyModel()
                newData.data = data
                realm.add(newData)
            }
        }
        data = realm.objects(MyModel.self)
    }
}

override func viewDidLoad() {
    super.viewDidLoad()
    
    populateDefaultData()
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接