【问题标题】:Previous realm data is lost when Realm migration is done in android在 android 中完成 Realm 迁移时,以前的领域数据会丢失
【发布时间】:2016-01-21 06:16:57
【问题描述】:

以前我使用的是 0.82.0 领域版本,现在我使用的是 0.87.0 版本。根据项目要求,我正在尝试将两个新表添加到现有领域架构中。

为此,我在下面添加了代码..

public class UnitDetails extends RealmObject {

    private int unitUid;

    private double noOfrooms;

    private int unitArea;

    private int fId;

    private int fNum;

    private int maxAvailablity;

    // and setters and getter methods

}

public class Quote extends RealmObject {

    private String qName;
    private String qLocation;

    // and setters and getter methods

}

迁移代码如下,使用应用上下文创建一个RealmConfiguration实例,在需要Realm实例的地方调用getRealmInstance()方法。

public class RealmUtils  {

    private static RealmConfiguration config;

    public static void createRealmConfig(Context context) { 

        config = new RealmConfiguration.Builder(context)
                .name("default.realm1")
                .schemaVersion(1)
                .migration(new CustomMigration())
                .build();
    }

    public static Realm getRealmInstance() { 

        return Realm.getInstance(config);
    }
}

public class CustomMigration implements RealmMigration {

    @Override
    public void migrate(final DynamicRealm realm, long oldVersion, long newVersion) {
        RealmSchema schema = realm.getSchema();
        if (oldVersion == 0) {
            RealmObjectSchema quoteSchema = schema.create("Quote")
                    .addField("qName", String.class)
                    .addField("qLocation", String.class);

            RealmObjectSchema unitDetailsSchema = schema.create("UnitDetails")
                    .addField("unitUid", int.class)
                    .addField("noOfrooms", double.class)
                    .addField("unitArea", int.class)
                    .addField("fId", int.class)
                    .addField("fNum", int.class)
                    .addField("maxAvailablity", int.class);
            oldVersion++;
        }
    }
}

当我通过安装新的 apk 更新我的应用程序时,我没有收到 RealmMigrationNeededException 但以前的数据丢失了。

这里出了什么问题以及如何防止数据丢失?我需要对现有表做任何事情吗?当我使用新的领域版本时,我应该注意什么?

【问题讨论】:

  • 上述代码应该可以工作,并且不会导致任何数据丢失。领域的名字真的是default.realm1吗?
  • 对于 shema 版本零,它是 default.realm,我为版本一提供了 default.realm1 名称。
  • 这就是您的数据消失的原因。该名称也是所使用文件的名称。如果您更改该名称,您将创建一个全新的文件。

标签: android realm


【解决方案1】:

您也不应该更新名称,只需更新版本号。以下配置应该可以工作:

public class RealmUtils  {

    private static RealmConfiguration config;

    public static void createRealmConfig(Context context) { 

        config = new RealmConfiguration.Builder(context)                                           
                .schemaVersion(1)
                .migration(new CustomMigration())
                .build();
    }

    public static Realm getRealmInstance() { 

        return Realm.getInstance(config);
    }
}

【讨论】:

  • 现在我遇到了异常
  • 错误 io.realm.exceptions.RealmMigrationNeededException:需要字段“slug”。将@Required 设置为字段“slug”或使用 io.realm.internal.Table.convertColumnToNullable() 进行迁移。私人字符串蛞蝓;并且在某些地方得到 IllegalArgumentException "A non-null RealmConfiguration must be provided"
  • slug 是这里现有表的字段
  • 这似乎与您在上面发布的代码无关,因为没有名为 slug 的字段。后者可能是因为您在调用getRealmInstance之前忘记调用createRealmConfig
  • 在我进行迁移之前,一切都很好,slug 是现有 Realm 表的字段。它为每个非原始字段提供错误 io.realm.exceptions.RealmMigrationNeededException:。我在应用程序的启动器(第一个)活动的 oncretae 中调用 createRealmConfig()。我正在从 JSON 填充数据,所以有些值可能为空,如何处理?在 0.87.0 版本中等于 convertColumnToNullable()
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多