更改 Realm 模型时出现 RealmMigrationNeededException

RealmMigrationNeededException when changing Realm model

每当我更改模型(例如添加更多字段)时,应用程序都会崩溃并出现 io.realm.exceptions.RealmMigrationNeededException 错误。这个只有卸载重装才能解决

有什么迁移建议吗?我只使用默认实例。

您应该可以在这里找到您需要的信息:

https://realm.io/docs/java/latest/#migrations

Just changing your code to the new definition will work fine, if you have no data stored on disk under the old database schema. But if you do, there will be a mismatch between what Realm sees defined in code & the data Realm sees on disk, so an exception will be thrown.

如果您对丢失旧数据没有任何问题,那么您可以删除领域配置并创建新的。

Realm realm = null;

                    try {
                       realm = Realm.getInstance(MainActivity.this);
                    } catch (RealmMigrationNeededException r) {
                        Realm.deleteRealmFile(MainActivity.this);
                        realm = Realm.getInstance(MainActivity.this);
                    }

RealmConfiguration config2 = new RealmConfiguration.Builder(this)
                .name("default2") 
                .schemaVersion(3) 
                .deleteRealmIfMigrationNeeded() 
                .build(); 


        realm = Realm.getInstance(config2);

如果您不想丢失数据,则必须执行 Migration,请参阅此示例 here

0.84.2 中的领域迁移发生了很大变化,使领域 (0.84.2) 迁移对我有用的关键点是:

  • 当你的应用程序有一个没有领域数据库时,schemaVersion 总是 0 指定 schemaVersion。在大多数情况下这是真的,因为你 一旦你可能开始在配置中使用 schemaVersion 需要迁移并且已经 运行 发布了您的应用程序。

  • schemaVersion 会自动存储,当您的应用程序进行全新安装并且您已经在 schemaVersion 3 时,realm 自动检查是否有异常,如果没有则设置 schemaVersion 为 3,这样您的迁移就不会在不需要时 运行。 这也意味着您不必再存储任何东西 SharedPreferences.

  • 在迁移中,当类型不可为空时,您必须设置新列的所有值,...

  • 可以插入空字符串,但仅当在列上设置 convertColumnToNullable 时才可以插入