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