【问题标题】:Realm Android - Multiple RealmModule for mutiple librariesRealm Android - 多个库的多个领域模块
【发布时间】:2017-10-16 14:10:47
【问题描述】:

我正在编写不同的库以创建单个应用程序。使用的每个库都使用自己的领域,在特定的测试应用程序上单独测试时,不会产生任何错误。

项目设置如下

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

LibraryOneRealmModuleLibraryTwoRealmModule 都是 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?它们都将包含librarylibrary2 的所有模型类。这可能会给每个库带来痛苦和不必要的迁移依赖。
  • @beeender 您是否建议列出每个库中的所有类?我使用这个是因为这些库是在不同的 Android Studio 项目中开发的,然后打包并包含为公共依赖项
  • .modules(Realm.getDefaultModule(), new LibraryOneRealmModule(), new LibraryTwoRealmModule()) 这一行将生成一个模式,其中包含 libOne 和 libTwo 中的所有模型。这就是为什么您还需要使用 libOne 处理迁移。如果您不需要跨库链接对象,我认为您应该为 libOne、libTwo 和您的应用程序使用单独的配置。

标签: java android realm realm-mobile-platform


【解决方案1】:

我已经解决了我的问题如下。

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. 我已将library1library2 代码中的所有Realm.getDefaultInstance() 替换为Lib1Realm.getDefaultInstance()Lib2.getDefaultInstance()

3. 我让包含library1library2 作为依赖项的app 模块通过在扩展com.android.Application 的类中简单地调用Realm.init(this) 来初始化Realm 实例.

这就是我正在做的事情。 看起来,问题在于这两个模块正在创建 Realm 对象的单个实例,这会导致冲突。 分离库配置添加一些代码是最好的选择,以使一切正常运行。

【讨论】:

    【解决方案2】:

    你可以试试:

    RealmObjectSchema missingObject = schema.get("LibOneRealmObject");
    if(missingObject == null) {
        missingObject = schema.create("LibOneRealmObject");    
        missingObject.addField("value", double.class);
    }
    oldVersion++;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多