预先填充数据的领域变成资产?

通常我使用Realm作为:

RealmConfiguration config = new RealmConfiguration.Builder(applicationContext).deleteRealmIfMigrationNeeded().build(); 

我怎样才能添加到我的项目的资产文件夹与数据的数据库,并阅读它?

Related of "预先填充数据的领域变成资产?"

自Realm Java 0.91.0以来,RealmConfiguration上有一个assetFile(String)选项,它会自动从资产中复制一个文件并在需要时使用它(例如,如果Realm首次打开或由于某种原因被删除):

 RealmConfiguration config = new RealmConfiguration.Builder() .assetFile("path/to/file/in/assets") // eg "default.realm" or "lib/data.realm" .deleteRealmIfMigrationNeeded() .build() 

上述操作将在Realm第一次打开时或者由于迁移而被删除(记住在这种情况下更新资产Realm)。


老解答:

可以将资产文件夹中的Realm数据库捆绑在一起,但只需要在第一次启动应用程序时从那里拷贝它。

我们有一个如何复制文件的例子: https : //github.com/realm/realm-java/blob/master/examples/migrationExample/src/main/java/io/realm/examples/realmmigrationexample/MigrationExampleActivity。 Java的#L101-Lundefined

 copyBundledRealmFile(this.getResources().openRawResource(R.raw.default_realm), "default.realm"); 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; } 

由于Realm 0.89.0 RealmConfiguration.initialData(Realm.Transaction)现在可以用于在第一次使用Realm文件之前填充Realm文件。

 RealmConfiguration conf = new RealmConfiguration.Builder(context) .initialData(new Realm.Transaction() { @Override public void execute(Realm realm) { realm.beginTransaction(); realm.createObject(....) realm.commitTransaction(); } }).deleteRealmIfMigrationNeeded().name("mRealm.db").build(); Realm realm = Realm.getInstance(conf); 

我们也有类似的需求,也希望支持与iOS版本的应用程序共享的只读领域数据库。

我们创build了一个简单的库,并且已经开源了。 它包含了@ christian-melchior的答案中给出的复制代码,以及一些与APK捆绑在一起的只读领域数据库的可选附加跟踪。 欢迎评论和PR。 看到:

https://github.com/eggheadgames/android-realm-asset-helper

Realm在它的RealmConfiguration.Builder有一个叫做assetFile的特殊参数。 你可以像这样使用它:

 realmConfiguration = new RealmConfiguration.Builder() .assetFile("dataBase/default.realm") // your app's packaged DB ... .build(); 

只需设置你的资产数据库path和文件名,你就可以在没有任何android-realm-asset-helper lib或copy-file-from-assets的代码的情况下运行。 在这个例子中,我的应用程序打包的DB文件位于“assets / dataBase / default.realm”。
请注意,下面的版本2有一个另外的方式来调用assetFile,你应该通过上下文另外:

 realmConfiguration = new RealmConfiguration.Builder(context) .assetFile(context, "dataBase/default.realm") .build(); 

你可以使用assetFile()方法。 请注意,您不能在assetFile()使用deleteIfMigrationNeeded()