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

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

【问题讨论】:

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

标签: realm


【解决方案1】:

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

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

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

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

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

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

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

  6. 您可以通过调用 [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()
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-06-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-28
      • 1970-01-01
      相关资源
      最近更新 更多