【发布时间】: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。如果有人能解释出了什么问题以及如何解决,将不胜感激。谢谢。 :)
【问题讨论】:
-
为您提供的迁移示例应用参考: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