如何交付带有预填充领域数据库的应用程序

Posted

技术标签:

【中文标题】如何交付带有预填充领域数据库的应用程序【英文标题】:How to deliver app with prefilled realm-database 【发布时间】:2015-07-02 14:24:42 【问题描述】:

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

【问题讨论】:

android / ios 或两者兼而有之? iOS - 有什么不同吗? 是的。 @jpsim 指向 iOS (Objective-C) 的文档。 ***.com/questions/26240286/… 指向使用 *.realm 文件的 Realm.getInstance() 的跨环境解决方案。 【参考方案1】:

Realm 的文档中有一个关于 "Bundling a Realm with an App" 的部分:

使用初始数据为应用程序播种是很常见的,这样您的用户在首次启动时就可以立即使用它。这样做的方法如下:

    首先,填充领域。您应该使用与最终交付应用程序相同的数据模型来创建一个领域,并使用您希望与您的应用程序捆绑的数据填充它。由于领域文件是跨平台的,您可以使用 OS X 应用程序(请参阅我们的 JSONImport 示例)或在模拟器中运行的 iOS 应用程序。

    在生成此领域文件的代码中,您应该完成该文件的压缩副本(请参阅 -[RLMRealm writeCopyToPath:error:])。这将减小 Realm 的文件大小,使您的最终应用更易于下载。

    将领域文件的新压缩副本拖动到最终应用的 Xcode Project Navigator。

    在 Xcode 中转到应用目标的构建阶段选项卡,并将领域文件添加到“复制捆绑资源”构建阶段。

    此时,您的应用可以访问捆绑的领域文件。您可以使用 [[NSBundle mainBundle] pathForResource:ofType:] 找到它的路径。

    您可以通过调用 [RLMRealm realmWithPath:readOnly:error:] 创建只读领域。或者,如果您想基于此初始数据创建可写领域文件,您可以使用 [[NSFileManager defaultManager] copyItemAtPath:toPath:error:] 将捆绑文件复制到应用程序的 Documents 目录,然后通过以下方式构建新领域使用 [RLMRealm realmWithPath:]。

您可以参考我们的migration sample app,了解如何使用捆绑领域文件的示例。

【讨论】:

Android 的说明如何? Java 的文档缺少类似的部分。 您可以在此处查看 Java 迁移示例中如何捆绑 Realm 文件的示例:github.com/realm/realm-java/blob/master/examples/…。 查看我的answer,了解 Realm Android 支持的添加初始数据的方式。 @jpsim 在 iOS 中这个特殊情况有什么简单的例子吗?因为迁移是另外一种情况,应该有一个简单的例子。 迁移捆绑的 Realm 文件是只使用它而不迁移的超集。如果您对示例的那部分不感兴趣,只需删除与迁移相关的代码即可。【参考方案2】:

Android 的预填充 Realm-database

将你的领域数据库放在 res/raw 文件夹中

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

// 复制领域数据库

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;

【讨论】:

【参考方案3】:

更简单的方法是创建一个 ad-hoc 函数,当您的领域模型(在本例中为“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()

【讨论】:

以上是关于如何交付带有预填充领域数据库的应用程序的主要内容,如果未能解决你的问题,请参考以下文章

如何使用预填充的 sqlite 数据库发布 phonegap 3.5 应用程序

带有 SQLite 插件的 Phonegap 预填充 SQLite 数据库?与Phonegap 1.2 兼容吗?

如何使用预填充的附件打开 Outlook 新邮件窗口

在同一页面上提交表单时如何预填充下拉列表?

是否可以预填充 AWS AppSync iOS 客户端?

iOS如何做预填充Core数据?