android - 在 Realm 中执行简单的迁移

标签 android migration database-migration realm

我正在为我的下一个 Android 应用测试 Realm 数据库,我想做一个简单的迁移。我在查看文档时有点困惑。

我有这个简单的类用户:

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!");
}

}

最佳答案

试试这个:

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);

关于android - 在 Realm 中执行简单的迁移,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34864985/

相关文章:

spring-boot - AMQP ConvertSendAndReceive 无法从 Spring Boot 1.5 迁移到 2

mysql - .NET Core 添加迁移忽略一些属性

php - CakePHP:使用过滤器部署数据库更改

java - 无法在 Android KitKat 上将 txt 文件写入 SD 卡

android - react-native 如何在特定时间安排后台作业

ruby-on-rails - Rails 中模型的错误复数化

sql - 如何在 Postgres 中基于 INSERT RETURNING id 进行 SQL 更新?

java - 为 Java 应用程序运行数据库迁移

java - Android 找不到 View

android - 如何从 google play 开发者控制台中删除暂停的应用程序?