java - Realm Android - 多个库的多 Realm 模块

标签 java android realm realm-mobile-platform

我正在组合不同的库以创建单个应用程序。使用的每个库都使用自己的 Realm,当在特定测试应用程序上单独测试时,不会产生任何错误。

项目设置如下

|- app
|- library\
|    |- LibraryOneRealmModule
|
|- library2
|    |- LibraryTwoRealmModule
|

其中 LibraryOneRealmModuleLibraryTwoRealmModule 都是 RealmModule 声明如下:

@RealmModule(library = true, allClasses = true)
public class LibraryOneRealmModule{
}



@RealmModule(library = true, allClasses = true)
public class LibraryTwoRealmModule{
}

现在,当我尝试将两个两个模块放在一起时,我使用的代码如下:

Realm.init(this);

RealmConfiguration realmConfig = new RealmConfiguration.Builder()
        .modules(Realm.getDefaultModule(), new LibraryOneRealmModule(), new LibraryTwoRealmModule())
        .build();

Realm.setDefaultConfiguration(realmConfig);

当我尝试运行该应用程序时,出现异常,告诉我需要迁移,因为已添加 LibOneRealmObject。即使这很奇怪,因为对象在 library1 中,我还是尝试按如下方式设置迁移对象:

class MyMigration implements RealmMigration {

    @Override public void migrate(@NonNull DynamicRealm realm, long oldVersion, long newVersion) {

        if (oldVersion == 0) {
            RealmSchema schema = realm.getSchema();
            RealmObjectSchema missingObject = schema.create("LibOneRealmObject");
            missingObject.addField("value", double.class);
            oldVersion++;
        }

    }

}

然后按如下方式更改 Realm 配置:

Realm.init(this);
RealmConfiguration realmConfig = new RealmConfiguration.Builder()
        .migration(new SellMigration())
        .schemaVersion(1)
        .modules(Realm.getDefaultModule(), new OrdersRealmModule(), new CartRealmModule())
        .build();

try {
    Realm.setDefaultConfiguration(realmConfig);
    Realm.migrateRealm(realmConfig);
} catch (Exception e) {
     e.printStackTrace();
}

但是当我再次尝试运行应用程序并且代码尝试访问 Realm 实例时,出现相同的错误告诉我:

io.realm.exceptions.RealmMigrationNeededException: Migration is required due to the following errors:

- Class 'LibOneRealmObject' has been added.

请注意,抛出异常的代码在 library1 中,如下所示:

Realm realm = Realm.getDefaultInstance();
realm.where(MyObject.class).findAllSorted();

我应该怎么做才能解决这个问题? 它与 library1 中的代码有关吗?或者它是在设置过程中 app 模块内部的东西吗?

最佳答案

我已经按照以下方式解决了我的问题。

1. 我已经使用以下代码在 library1library 中创建了一个类:

public class Lib1Realm {

    private static final String REALM_NAME = "my.lib1.realm";
    private static RealmConfiguration realmConfiguration;

    private CartRealm(){}

    public static Realm getDefaultInstance() {
        if (realmConfiguration == null) {
            realmConfiguration = new RealmConfiguration.Builder()
                    .name(REALM_NAME)
                    .modules(new LibraryOneRealmModule())
                    .build();
        }

        return Realm.getInstance(realmConfiguration);
    }

}

public class Lib2Realm {

    private static final String REALM_NAME = "my.lib2.realm";
    private static RealmConfiguration realmConfiguration;

    private CartRealm(){}

    public static Realm getDefaultInstance() {
        if (realmConfiguration == null) {
            realmConfiguration = new RealmConfiguration.Builder()
                    .name(REALM_NAME)
                    .modules(new LibraryTwoRealmModule())
                    .build();
        }

        return Realm.getInstance(realmConfiguration);
    }

}

2. 我已经替换了 library1library2 代码中的所有 Realm.getDefaultInstance()分别使用 Lib1Realm.getDefaultInstance()Lib2.getDefaultInstance()

3. 我让包含 library1library2 作为依赖项的 app 模块初始化 Realm 实例,只需在扩展 com.android.Application 的类中调用 Realm.init(this) 即可。

这就是我正在做的事情。 看起来,问题在于这两个模块正在创建 Realm 对象的单个实例,这会导致冲突。 分离库配置并添加一些代码是为了使一切正常工作而可能采取的最佳选择。

关于java - Realm Android - 多个库的多 Realm 模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46772377/

相关文章:

java - Java如何将windows放到桌面上?

android - 返回类型 'getItem' 不是被覆盖成员的返回类型的子类型

android - 在 Hint、TextInputLayout 上设置自定义字体

ios - 避免 Realm 数据库中自定义对象数组的重复。当主键仅存在于关系表中时

android - Realm 已经在/Users/cm/Realm/中的写入事务中

ios - 在 Realm Swift 中过滤嵌套数组上的对象

java - 推荐用于 Swing 应用程序或替代库的通用 CSS 引擎

java - ClassNotFoundException 之谜

java - 英特尔 XDK - 使用演示 - 选项为空

android - 唤醒锁不工作