我想在我的领域数据库中提供已预先填充数据的应用程序。我是否只需将其复制到文档目录或是否还有其他事情要做?
答案 0 :(得分:30)
Realm的文档中有一节"Bundling a Realm with an App":
通常会为应用程序添加初始数据,使其在首次启动时立即可供用户使用。以下是如何执行此操作:
首先,填充领域。您应使用与最终发货应用相同的数据模型来创建领域,并使用您希望与应用捆绑在一起的数据填充该领域。由于领域文件是跨平台的,您可以使用OS X应用程序(请参阅我们的JSONImport示例)或在模拟器中运行的iOS应用程序。
在生成此域文件的代码中,您应该通过制作文件的压缩副本来完成(请参阅 - [RLMRealm writeCopyToPath:error:])。这将减少Realm的文件大小,使您的最终应用程序更轻松地为您的用户下载。
将领域文件的新压缩副本拖到最终应用程序的Xcode Project Navigator中。
转到Xcode中的app target的构建阶段选项卡,并将realm文件添加到“Copy Bundle Resources”构建阶段。
此时,您的应用可以访问您的捆绑领域文件。您可以使用[[NSBundle mainBundle] pathForResource:ofType:]找到它的路径。
- 醇>
您可以通过调用[RLMRealm realmWithPath:readOnly:error:]来创建只读域。或者,如果您想基于此初始数据创建可写领域文件,可以使用[[NSFileManager defaultManager] copyItemAtPath:toPath:error:]将捆绑文件复制到应用程序的Documents目录,然后通过以下方式构建新领域:使用[RLMRealm realmWithPath:]。
您可以参考我们的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()
}