【问题标题】:Realm Migration Issue in AndroidAndroid 中的领域迁移问题
【发布时间】:2018-07-20 10:33:02
【问题描述】:

我有一个数据库,其中包含一些添加的新列。据我了解,当有人第一次创建应用程序时,默认架构版本设置为 0。稍后我们需要增加。

我所做的是,我设置了 SCHEMA_VERSION = 1,因为架构中有一个新的变化,并且期望任何设备上新安装的应用程序都将包含默认架构为 1。

我正在使用两台不同的设备进行测试,一台运行 Android 6.0 (Marshmellow),另一台运行 Android 8.0 (Oreo)。

问题是,在 6.0 中运行应用程序时,我第一次将默认架构设置为 -1。后来,当我明确设置架构版本 1 时,它将默认设置为 1,这是预期的,并且不会调用迁移,因为它安装在 第一次使用设备。

RealmConfiguration.Builder builder = new RealmConfiguration.Builder();
    builder.schemaVersion(SCHEMA_VERSION); // SCHEMA_VERSION = 1
    builder.migration(new Migration());

Realm.setDefaultConfiguration(builder.build());
Realm.getDefaultInstance().close();

但是当我在 8.0 中尝试相同的代码时,我将默认架构设置为 0,而当我设置时

builder.schemaVersion(SCHEMA_VERSION); // SCHEMA_VERSION = 1 

,Migration() 被调用并且抛出字段已经存在,因为它正在考虑 SCHEMA_VERSION = 1 是更新。

这意味着,在 8.0 中,即使我们是第一次安装应用程序,也要注意 SCHEMA_VERSION = 0 是添加了所有列的默认值(因为我可以看到数据库已经添加了列)。

可能出了什么问题?为什么有两种不同的默认架构 两个设备上新应用程序的版本(-1 和 0)?无论如何,如果它 第一次安装在设备上,为什么会迁移 被叫了?

这是我在设置 SCHEMA_VERSION 之前使用的代码 sn-p 获取默认架构版本..

DynamicRealm dynamicRealm = DynamicRealm.getInstance(Realm.getDefaultConfiguration());
long version = dynamicRealm.getVersion();
dynamicRealm.close();

我还搜索了 SO Q&As,阅读了文章,但找不到任何符合我的问题的内容。请跟踪问题here。如果有人能解释出了什么问题以及如何解决,将不胜感激。谢谢。 :)

【问题讨论】:

  • 您是否关注了文档:realm.io/docs/java/latest/#migrations
  • 为您提供的迁移示例应用参考:github.com/realm/realm-java/tree/master/examples/…
  • 我不知道你的迁移代码,也不知道什么“失败”,所以我真的无话可说
  • @Arvind,是的,我正在关注文档,我也检查了 github 代码。问题是不同设备上的不同行为。一个正在调用迁移,另一个没有。
  • @EpicPandaForce,这与迁移代码的工作或失败无关。问题是为什么它首先调用迁移而在其他设备中却不是?如果您检查我在问题的后面部分添加的代码 sn-p 以获取默认架构,您会看到,如果我在 RealmBuilder 之前执行这 3 行代码,我会在两个不同的设备中获得两个不同的默认架构版本. OS 6.0、OS 8.0 的行为不同。如果可能,请提供帮助。

标签: android realm realm-mobile-platform realm-migration


【解决方案1】:

我发现,三星 Note 8 设备在重启设备后开始工作。在此之前,我尝试卸载并重新安装应用程序,我很确定我删除了所有可能的东西。哪个不起作用并开始调用迁移。现在这不再发生并且完美地工作。 :)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多