在 android 中将领域版本从 0.82.1 更改为 0.87.5 后发生致命异常崩溃

fatal exception crash after changing realm version from 0.82.1 to 0.87.5 in android

将领域的版本从 0.82.1 更改为 0.87.5 后出现此错误。

FATAL EXCEPTION: main Process: com.xxxxx.consumer, PID: 8633
java.lang.RuntimeException: Unable to create applicationcom.gemba.consumer.realm.AppInstance: 
java.lang.IllegalArgumentException: Configurations cannot be different if used to open the same file. 
Cached configuration: 
                                                              realmFolder: /data/user/0/com.xxxx.consumer/files
                                                              realmFileName : default.realm
                                                              canonicalPath: /data/data/com.xxxx.consumer/files/default.realm
                                                              key: [length: 0]
                                                              schemaVersion: 0
                                                              migration: null
                                                              deleteRealmIfMigrationNeeded: true
                                                              durability: FULL
                                                              schemaMediator: io.realm.DefaultRealmModuleMediator@b40b99c9

我的领域管理器class是这个 public 最终 class RealmManager {

public static RealmManager realmManager;
public static RealmConfiguration realmConfig;
public static Realm realm;
public static WorkerThread workerThread;
public static Context appContext;

public static RealmManager getInstance(Context context) {

    if (realmManager == null) {
        realmManager = new RealmManager();

        getRealmConfig(context);
        realm = Realm.getInstance(realmConfig);
        workerThread = new WorkerThread(context);
        appContext = context;
    }

    return realmManager;
}

public static RealmConfiguration getRealmConfig(Context context) {
    if (realmConfig == null) {
        realmConfig = new RealmConfiguration.Builder(context)
                .deleteRealmIfMigrationNeeded()
                .build();

    }
    return realmConfig;

}

我在应用程序 class.

中这样使用它
RealmManager.getInstance(getApplicationContext());

每个 Realm 实例都是基于 RealmConfiguration.

创建的

getInstance()RealmConfiguration 上调用指向一个已经在另一个 RealmConfiugration 上打开的 Realm 文件(相同的文件路径)时,新配置必须相同与旧的。

getInstance(Context context) 的实现如下所示。

public static Realm getInstance(Context context) {
    return Realm.getInstance(new RealmConfiguration.Builder(context)
            .name(DEFAULT_REALM_NAME)
            .build());
}

当你打电话时

RealmManager.getInstance(getApplicationContext());

在应用程序的文件目录中使用默认领域名称“default.realm隐式创建了 RealmConfiguration。它与您在 getRealmConfig 中创建的不同——没有 deleteRealmIfMigrationNeeded().

要解决此问题,只需在所有地方使用 getRealmConfig 返回的相同配置。顺便说一句,您的 getRealmConfig() 不是线程安全的,如果它将在不同的线程中调用,您可能需要修复它。

Realm.getInstance(Context context) 在 Realm 0.88.0 中被弃用。