Java Realm Android-用于多个库的多个RealmModule

Java Realm Android-用于多个库的多个RealmModule,java,android,realm,realm-mobile-platform,Java,Android,Realm,Realm Mobile Platform,为了创建一个应用程序,我正在编写不同的库。使用的每个库都使用自己的领域,当在特定的测试应用程序上单独测试时,不会产生任何错误 项目设置如下所示 |- app |- library\ | |- LibraryOneRealmModule | |- library2 | |- LibraryTwoRealmModule | 其中libraryonerealmodule和librarytworeammodule均声明为realmodules,如下所示: @RealmModule(libr

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

项目设置如下所示

|- app
|- library\
|    |- LibraryOneRealmModule
|
|- library2
|    |- LibraryTwoRealmModule
|
其中
libraryonerealmodule
librarytworeammodule
均声明为
realmodule
s,如下所示:

@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.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();
}
但当我再次尝试运行应用程序,代码尝试访问
领域
实例时,同样的错误出现,告诉我:

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
中的代码有关?或者在安装过程中,它是
应用程序
模块中的某个东西?

您可以尝试:

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

我已经解决了我的问题如下

1。我在
library1
library
中创建了一个具有以下代码的类:

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);
    }

}

2.我已经分别用
Lib1Realm.getDefaultInstance()和
Lib2.getDefaultInstance()替换了
library1
Lib2.getDefaultInstance()中的所有
Realm.getDefaultInstance()

3.我让
app
模块作为依赖项,包括
library1
library2
通过在扩展
com.android.Application
的类中调用
Realm.init(this)
来初始化
Realm
实例

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

为什么对这两个模块都使用
allClasses
?它们都将包含
library
library2
的所有模型类。这可能会给每个库带来痛苦和不必要的迁移依赖关系。@Beender您建议列出每个库中的所有类吗?我之所以使用它,是因为这些库是在不同的Android Studio项目中开发的,然后打包并作为公共依赖项
.modules(Realm.getDefaultModule()、new LibraryOneRealmModule()、new LibraryTwoRealmModule())
这一行将生成一个模式,其中包含libOne和libTwo中的所有模型。这就是为什么您还需要使用libOne处理迁移。如果不需要跨libs链接对象,我认为应该为libOne、libTwo和应用程序使用单独的配置。
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);
    }

}