【问题标题】:Performing a simple migration in Realm在 Realm 中执行简单的迁移
【发布时间】:2016-04-24 05:30:31
【问题描述】:

我正在为我的下一个 Android 应用程序测试 Realm db,我想做一个简单的迁移。我看了文档有点困惑。

我有这个简单的类用户:

public class User extends RealmObject {
@PrimaryKey
private String name;
private int age;

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

public int getAge() {
    return age;
}

public void setAge(int age) {
    this.age = age;
}
}

我想(通过迁移)向表用户添加一个名为“phoneNumber”的附加字段。我不明白如何/在哪里可以启动迁移?我正在像这样的应用程序 onCreate 方法中创建架构:

public class MyApplication extends Application {

    @Override
    public void onCreate() {
        super.onCreate();
        RealmConfiguration realmConfiguration = new RealmConfiguration.Builder(this)
                .schemaVersion(0)
                .migration(new MyMigration())
                .build();
        Realm.setDefaultConfiguration(realmConfiguration);
}

}

还有我的迁移班:

public class MyMigration implements RealmMigration {
@Override
public void migrate(DynamicRealm realm, long oldVersion, long newVersion) {
    // DynamicRealm exposes an editable schema
    RealmSchema schema = realm.getSchema();

    // Migrate to version 1: Add a new class.
    // Example:
    // public Person extends RealmObject {
    //     private String name;
    //     private int age;
    //     // getters and setters left out for brevity
    // }
    if (oldVersion == 0) {
        schema.create("User")
                .addField("name", String.class)
                .addField("age", int.class);
        oldVersion++;
    }

    // Migrate to version 2: Add a primary key + object references
    // Example:
    // public Person extends RealmObject {
    //     private String name;
    //     @PrimaryKey
    //     private int age;
    //     private Dog favoriteDog;
    //     private RealmList<Dog> dogs;
    //     // getters and setters left out for brevity
    // }
    if (oldVersion == 1) {
        schema.get("User")
                .addField("phoneNumber", long.class, FieldAttribute.REQUIRED);
        oldVersion++;
    }

    Log.d("MainActivity","Migration happend!");
}

}

【问题讨论】:

    标签: android migration database-migration realm


    【解决方案1】:

    试试这个:

    public void migrate(DynamicRealm realm, long oldVersion, long newVersion) {
        // DynamicRealm exposes an editable schema
        RealmSchema schema = realm.getSchema();
    
        // This is the current schema version before migration.
        if (oldVersion == 0) {
            schema.get("User")
                .addField("phoneNumber", long.class, FieldAttribute.REQUIRED);
            oldVersion++;
        }
    
        // More migrations (for version 1->2, 2->3, etc..) in the future.
    }
    

    然后创建RealmConfiguration,如下所示:

    RealmConfiguration realmConfiguration = new RealmConfiguration.Builder(this)
                .schemaVersion(1) // This the expected schema version after migration.
                .migration(new MyMigration())
                .build();
    Realm.setDefaultConfiguration(realmConfiguration);
    

    【讨论】:

    • 当我使用它时,编译器会抱怨“从未使用过在 'oldVersion++' 处更改的值,并且我的版本从未增加。有什么想法吗?
    • oldVersion的增量仅用于处理migrate内部的多次迁移。例如。当您有一个新的迁移 1->2 时,不必更改块 if (oldVersion == 0) 中的代码,只需添加一个新块 if (oldVersion == 1)。在进行另一次迁移之前,您可以忽略 lint 警告或注释掉 oldVersion++。你是什​​么意思“我的版本永远不会增加”?如果没有异常,用.schemaVersion(1)成功打开第一个Realm实例后,你的db应该是版本1。你可以在migrate中设置一个BP看看会发生什么?
    • 使用上面的代码,我的迁移永远不会被调用。我将 System.out.println 放在 Migration.class 的顶部,并且从未使用上述方法调用它
    • 如果是新安装的----旧的Realm db文件不存在,不会调用migration。如果是你的情况?
    • 抱歉回复缓慢。是的,旧领域数据库存在并且其中存储了数据。加载时的例外是必须提供 RealmMigration
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多