如何交付带有预填充领域数据库的应用程序
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 应用程序