Realm Android - 多个RealmModule用于多个库

时间:2017-10-16 14:10:47

标签: java android realm realm-mobile-platform

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

项目设置如下

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

LibraryOneRealmModuleLibraryTwoRealmModule的{​​{1}}声明如下:

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模块内的东西吗?

2 个答案:

答案 0 :(得分:1)

我已经解决了以下问题。

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。我已使用Realm.getDefaultInstance()和{{1}替换了library1library2代码中的所有Lib1Realm.getDefaultInstance()分别。

3。我让包含Lib2.getDefaultInstance()app的{​​{1}}模块作为依赖项,只需调用{{1}即可初始化library1实例在扩展library2的类中。

这正是我的工作。 看起来,问题是这两个模块正在创建Realm对象的单个实例,然后导致冲突。 分离库配置添加一些代码是可以采取的最佳选择,以使一切正常工作。

答案 1 :(得分:0)

你可以尝试:

RealmObjectSchema missingObject = schema.get("LibOneRealmObject");
if(missingObject == null) {
    missingObject = schema.create("LibOneRealmObject");    
    missingObject.addField("value", double.class);
}
oldVersion++;