我正在组成不同的库以创建单个应用程序。每个使用的库都使用自己的领域,当在特定测试应用程序上进行单独测试时,它们不会产生任何错误。
项目设置如下
|- app
|- library\
| |- LibraryOneRealmModule
|
|- library2
| |- LibraryTwoRealmModule
|
其中
LibraryOneRealmModule
和LibraryTwoRealmModule
都是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. 我已经使用以下代码在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);
}
}
和
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
替换了library2
和Lib1Realm.getDefaultInstance()
代码中的所有Lib2.getDefaultInstance()
。3. 我只需要在扩展了
app
的类中调用library1
,就可以将包括library2
和Realm
作为依赖项的Realm.init(this)
模块初始化com.android.Application
实例。这就是为我工作的东西。
看起来,问题在于这两个模块正在创建
Realm
对象的单个实例,然后导致冲突。分离库配置并添加一些代码是使所有组件正常工作的最佳选择。