[英]Realm Android - Multiple RealmModule for mutiple libraries
我正在組合不同的庫以創建單個應用程序。 使用的每個庫都使用自己的 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.我已經全部換成了Realm.getDefaultInstance()
內library1
和library2
代碼Lib1Realm.getDefaultInstance()
和Lib2.getDefaultInstance()
respectevly。
3.我讓app
模塊,其中包括library1
和library2
作為依賴初始化Realm
通過簡單地調用實例Realm.init(this)
,其延伸一類的內部com.android.Application
。
這就是我正在做的事情。 看起來,問題在於這兩個模塊正在創建Realm
對象的單個實例,從而導致沖突。 分離庫配置添加一些代碼是為了使一切正常工作而可能采取的最佳選擇。
你可以試試:
RealmObjectSchema missingObject = schema.get("LibOneRealmObject");
if(missingObject == null) {
missingObject = schema.create("LibOneRealmObject");
missingObject.addField("value", double.class);
}
oldVersion++;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.