【发布时间】:2017-10-16 14:10:47
【问题描述】:
我正在编写不同的库以创建单个应用程序。使用的每个库都使用自己的领域,在特定的测试应用程序上单独测试时,不会产生任何错误。
项目设置如下
|- app
|- library\
| |- LibraryOneRealmModule
|
|- library2
| |- LibraryTwoRealmModule
|
LibraryOneRealmModule 和 LibraryTwoRealmModule 都是 RealmModules 声明如下:
@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 模块内部的东西?
【问题讨论】:
-
为什么两个模块都使用
allClasses?它们都将包含library和library2的所有模型类。这可能会给每个库带来痛苦和不必要的迁移依赖。 -
@beeender 您是否建议列出每个库中的所有类?我使用这个是因为这些库是在不同的 Android Studio 项目中开发的,然后打包并包含为公共依赖项
-
.modules(Realm.getDefaultModule(), new LibraryOneRealmModule(), new LibraryTwoRealmModule())这一行将生成一个模式,其中包含 libOne 和 libTwo 中的所有模型。这就是为什么您还需要使用 libOne 处理迁移。如果您不需要跨库链接对象,我认为您应该为 libOne、libTwo 和您的应用程序使用单独的配置。
标签: java android realm realm-mobile-platform