android - 做Realm Migration Android的正确方法

标签 android realm realm-migration

我们将 Realm 用于我们的应用程序。我们的应用程序已发布测试版。现在我想向我们的一个 Realm 对象添加一个字段。所以我必须写RealmMigration,我也写了一个。这里的问题是如何将此 Realm 迁移应用到我的应用程序。每当我想要某些东西时,我都会使用 Realm.getInstance() 获取 Realm 实例。请记住,Realm.getInstance() 每次都在整个应用程序中使用,我想访问 Realm 数据库。

那么,我对如何应用此迁移有点疑问?任何线索都会有所帮助。谢谢。

我的 RealmMigration 如下。

public class RealmMigrationClass implements RealmMigration {
    @Override
    public void migrate(DynamicRealm realm, long oldVersion, long newVersion) {
        if(oldVersion == 0) {
            RealmSchema sessionSchema = realm.getSchema();

            if(oldVersion == 0) {
                RealmObjectSchema sessionObjSchema = sessionSchema.get("Session");
                sessionObjSchema.addField("isSessionRecordingUploading", boolean.class, FieldAttribute.REQUIRED)
                        .transform(new RealmObjectSchema.Function() {
                            @Override
                            public void apply(DynamicRealmObject obj) {
                                obj.set("isSessionRecordingUploading", false);
                            }
                        });


                sessionObjSchema.setNullable("isSessionRecordingUploading",false);
                oldVersion++;
            }

        }
    }

}

public class Session extends RealmObject {

    @PrimaryKey
    private String id;
    @Required
    private Date date;
    private double latitude;
    private double longitude;
    private String location;
    private String note;
    private String appVersion;
    private String appType;
    private String deviceModel;
    private HeartRecording heart;
    private TemperatureRecording temperature;
    private LungsRecording lungs;
    @NotNull
    private boolean isSessionRecordingUploading;
    private boolean sessionInfoUploaded;
    private boolean lungsRecordingUploaded;
    private boolean heartRecordingUploaded;

}

从 RealmObject 中删除了 Getter 和 Setter 以缩短问题。当我尝试重新安装应用程序而不卸载前一个应用程序时发生异常。请指教。

最佳答案

这里有描述:https://realm.io/docs/java/latest/#migrations

但从本质上讲,您只需提升架构版本并像这样设置配置:

RealmConfiguration config = new RealmConfiguration.Builder(context)
    .schemaVersion(2) // Must be bumped when the schema changes
    .migration(new MyMigration()) // Migration to run
    .build();

Realm.setDefaultConfiguration(config);

// This will automatically trigger the migration if needed
Realm realm = Realm.getDefaultInstance();

关于android - 做Realm Migration Android的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35836761/

相关文章:

android - 固定屏幕方向

android - 为同一应用程序、多个平台设置 Google Analytics 的最佳方式

ios - Realm <结果> 在函数之外丢失数据

android - 错误类型3-错误: Activity 类MainActivity不存在

swift - 'valueForKeyPath:' 函数不支持

ios - 排序快速插入的 Realm 记录

swift - 无法在 Swift 中进行 Realm 迁移

realm - 非法参数异常 : Field name doesn't exist on object while doing migration

ios - Realm 迁移引入主键

android kotlin java.io.FileNotFoundException :/storage/emulated/0/number. txt:打开失败:EACCES(权限被拒绝)