问题 将预先填充的数据转化为资产的领域?


通常我使用Realm作为:

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

如何将包含数据的数据库添加到项目的assets文件夹中并读取它?


6049
2017-11-12 15:23


起源



答案:


自从Realm Java 0.91.0出现以来 assetFile(String) 关于的选项 RealmConfiguration 自动将从资产中复制文件并在需要时使用该文件(例如,如果Realm第一次打开或由于某种原因被删除):

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

以上将在第一次打开Realm时从资产中复制文件,或者由于迁移而被删除(请记住在这种情况下更新资产Realm)。


老答案:

可以将一个Realm数据库捆绑在assets文件夹中,但是只需要在第一次启动应用程序时从那里复制它。

我们有一个如何在这里复制文件的例子: 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;
}

8
2017-11-13 07:29



也许 这个 应该更新使用 assetFile() - EpicPandaForce
好主意。完成。 - Christian Melchior
很高兴看到 assetFile() 添加!对于Realm以只读方式使用的场景(例如产品目录场景),拥有“只有更新,更新”选项也是很好的。这样可以避免不必要的复制,但可以简化操作。 (我很想退休: github.com/eggheadgames/android-realm-asset-helper !) - mm2001


答案:


自从Realm Java 0.91.0出现以来 assetFile(String) 关于的选项 RealmConfiguration 自动将从资产中复制文件并在需要时使用该文件(例如,如果Realm第一次打开或由于某种原因被删除):

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

以上将在第一次打开Realm时从资产中复制文件,或者由于迁移而被删除(请记住在这种情况下更新资产Realm)。


老答案:

可以将一个Realm数据库捆绑在assets文件夹中,但是只需要在第一次启动应用程序时从那里复制它。

我们有一个如何在这里复制文件的例子: 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;
}

8
2017-11-13 07:29



也许 这个 应该更新使用 assetFile() - EpicPandaForce
好主意。完成。 - Christian Melchior
很高兴看到 assetFile() 添加!对于Realm以只读方式使用的场景(例如产品目录场景),拥有“只有更新,更新”选项也是很好的。这样可以避免不必要的复制,但可以简化操作。 (我很想退休: github.com/eggheadgames/android-realm-asset-helper !) - mm2001


自从境界 0.89.0  RealmConfiguration.initialData(Realm.Transaction) 现在可用于在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);

3
2018-05-19 14:39





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

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

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


2
2018-04-11 19:09



请给我们一个完整的项目代码,以演示如何使用该库 - kinsley kajiva


Realm在其中有一个特殊参数 RealmConfiguration.Builder 称为assetFile。您可以使用它:

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

只需设置你的资产数据库路径和文件名,你就可以不用任何android-realm-asset-helper lib或copy-file-from-assets代码。在这个例子中,我的app打包的DB文件位于“assets / dataBase / default.realm”中。
注意,2以下的版本有另一种调用assetFile的方法,你应该另外传递上下文:

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

1
2017-11-09 17:32





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


0
2017-08-24 08:11



这是行不通的我在2.3.1上尝试过 - kinsley kajiva
它应该工作,API是相同的。 - EpicPandaForce
我已经做到了,但这里的问题是它没有粉碎或什么,但当我使用assetFile()方法时,我的查询将为空。它好像什么也没发生,因此问题出现了。 - kinsley kajiva