簡體   English   中英

Realm Android - 用於多個庫的多個 RealmModule

[英]Realm Android - Multiple RealmModule for mutiple libraries

我正在組合不同的庫以創建單個應用程序。 使用的每個庫都使用自己的 Realm,當在特定的測試應用程序上單獨測試時,不會產生任何錯誤。

項目設置如下

|- app
|- library\
|    |- LibraryOneRealmModule
|
|- library2
|    |- LibraryTwoRealmModule
|

其中LibraryOneRealmModuleLibraryTwoRealmModule都是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.我在library1library創建了一個類,代碼如下:

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()library1library2代碼Lib1Realm.getDefaultInstance()Lib2.getDefaultInstance() respectevly。

3.我讓app模塊,其中包括library1library2作為依賴初始化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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM