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

项目设置如下

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

其中LibraryOneRealmModuleLibraryTwoRealmModule都是RealmModule,声明如下:
@RealmModule(library = true, allClasses = true)
public class LibraryOneRealmModule{
}



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

现在,当我尝试放置togheter两个两个模块时,我正在使用的代码如下:
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. 我已分别用Realm.getDefaultInstance()library1替换了library2Lib1Realm.getDefaultInstance()代码中的所有Lib2.getDefaultInstance()

3. 我只需要在扩展了app的类中调用library1,就可以将包括library2Realm作为依赖项的Realm.init(this)模块初始化com.android.Application实例。

这就是为我工作的东西。
看起来,问题在于这两个模块正在创建Realm对象的单个实例,然后导致冲突。
分离库配置并添加一些代码是使所有组件正常工作的最佳选择。

08-04 00:25