如何使用预先填充的领域数据库提供应用程序

时间:2015-04-24 05:53:58

标签: realm

我想在我的领域数据库中提供已预先填充数据的应用程序。我是否只需将其复制到文档目录或是否还有其他事情要做?

3 个答案:

答案 0 :(得分:30)

Realm的文档中有一节"Bundling a Realm with an App"

  

通常会为应用程序添加初始数据,使其在首次启动时立即可供用户使用。以下是如何执行此操作:

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

  2.   
  3. 在生成此域文件的代码中,您应该通过制作文件的压缩副本来完成(请参阅 - [RLMRealm writeCopyToPath:error:])。这将减少Realm的文件大小,使您的最终应用程序更轻松地为您的用户下载。

  4.   
  5. 将领域文件的新压缩副本拖到最终应用程序的Xcode Project Navigator中。

  6.   
  7. 转到Xcode中的app target的构建阶段选项卡,并将realm文件添加到“Copy Bundle Resources”构建阶段。

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

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

  12.         

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

答案 1 :(得分:3)

预填充的Realm-database For Android

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

并在activity中执行以下代码:

//复制领域数据库

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;
}

答案 2 :(得分: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()
}