我正在编写不同的库以创建单个应用程序。使用的每个库都使用自己的Realm,当在特定测试应用程序上单独测试时,不会产生任何错误。
项目设置如下
|- app
|- library\
| |- LibraryOneRealmModule
|
|- library2
| |- LibraryTwoRealmModule
|
LibraryOneRealmModule
和LibraryTwoRealmModule
的{{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
模块内的东西吗?
答案 0 :(得分:1)
我已经解决了以下问题。
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()
和{{1}替换了library1
和library2
代码中的所有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++;