我正在组合不同的库以创建单个应用程序。使用的每个库都使用自己的 Realm,当在特定测试应用程序上单独测试时,不会产生任何错误。
项目设置如下
|- app
|- library\
| |- LibraryOneRealmModule
|
|- library2
| |- LibraryTwoRealmModule
|
其中 LibraryOneRealmModule
和 LibraryTwoRealmModule
都是 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. 我已经使用以下代码在 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. 我已经替换了 library1
和 library2
代码中的所有 Realm.getDefaultInstance()
分别使用 Lib1Realm.getDefaultInstance()
和 Lib2.getDefaultInstance()
。
3. 我让包含 library1
和 library2
作为依赖项的 app
模块初始化 Realm
实例,只需在扩展 com.android.Application
的类中调用 Realm.init(this)
即可。
这就是我正在做的事情。
看起来,问题在于这两个模块正在创建 Realm
对象的单个实例,这会导致冲突。
分离库配置并添加一些代码是为了使一切正常工作而可能采取的最佳选择。
关于java - Realm Android - 多个库的多 Realm 模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46772377/