【问题标题】:Open realm with new realmconfiguration使用新领域配置打开领域
【发布时间】:2016-04-28 06:34:05
【问题描述】:

到目前为止,我在我的 android 中使用 Realm new RealmConfiguration.Builder(this) .build();

我稍后才读到关于添加架构和迁移的可能性。 所以在我的应用程序的新版本中,我想添加迁移功能。 所以我将上面的行改为:

new RealmConfiguration.Builder(this) .schemaVersion(0) .migration(new Migration()) .build();

但现在我得到了错误

IllegalArgumentException: Configurations cannot be different if used to open the same file. 

如何在不删除数据库的情况下更改配置

【问题讨论】:

    标签: android realm


    【解决方案1】:

    我认为您的问题是您正在多次创建 RealmConfiguration。这本身不应该是一个问题(尽管它效率低下),但问题出现在您的 Migration 类中。在内部,我们比较配置对象中的所有状态,如果您没有在您的 Migration 类中覆盖 equalshashCode,您会遇到 new Migration().equals(new Migration()) == false 的情况,这会给您所看到的错误。

    一个解决方案是添加这个:

    public class Migration implements RealmMigration {
    
      // Migration logic...
    
      @Override
      public int hashCode() {
        return 37;
      }
    
      @Override
      public boolean equals(Object o) {
        return (o instanceof Migration);
      }
    }
    

    【讨论】:

    • 这解决了我的问题。我花了一段时间才明白这实际上是我的问题。我现在按照您的建议限制 RealmConfiguration 的创建。但我必须多次使用它,因为我在多个线程中使用领域。
    • 将其保存在应用程序类的静态变量中或将其保存为默认配置都应该可以作为轻松访问它的方式。
    • 在 Java new Migration() != new Migration() 中,除非您覆盖 equals/hashcode。如果您不断地创建配置对象,那么您也会不断地重新创建迁移对象。通过覆盖equals/hashcode,你告诉Java它是同一个对象,不管它是否被创建了两次。
    • @ChristianMelchior 你能解释一下,为什么是 37?
    • 那只是随机选择的,可以是任意数字
    【解决方案2】:

    当您使用schemaVersion() 设置新架构版本时,版本号应等于或高于现有领域文件的架构版本。然后,您提供的 RealmMigration() 应该能够将旧版本的模式转换为新版本。

    我建议先检查您现有的架构版本,然后检查您的 RealmObjects 以进行适当的转换。

    【讨论】:

    • 问题似乎是,当我第一次创建领域时,我根本没有添加架构。请参阅我的帖子,了解我是如何创建它的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-12
    • 2014-04-05
    • 1970-01-01
    • 2017-11-12
    相关资源
    最近更新 更多