Realm(Java)数据库使用文档(迁移Migrations)

Realm(Java)数据库使用文档(目录)

使用任何数据库时,您的model类(即数据库架构)很可能会随着时间而改变。由于Realm中的model类被定义为标准对象,因此更改架构就像更改相应RealmObject子类的接口一样容易。

9.1 本地迁移

对于未同步到服务端的Realms,执行迁移需要对RealmConfiguration进行两项更改:设置新的架构版本,以及编写代码以执行迁移。

RealmConfiguration config = new RealmConfiguration.Builder()
    .schemaVersion(2) // Must be bumped when the schema changes
    .migration(new MyMigration()) // Migration to run instead of throwing an exception
    .build()

使用此功能,迁移代码将在需要时自动运行。我们提供了内置方法,因此您可以升级磁盘上的架构以及为该架构的早期版本存储的数据。

// 示例迁移添加新类
public class MyMigration implements RealmMigration {

  @Override
  public void migrate(DynamicRealm realm, long oldVersion, long newVersion) {

     // DynamicRealm公开了可编辑的架构
     RealmSchema schema = realm.getSchema();

     // 迁移至版本1:添加新类。
     // Example:
     // public Person extends RealmObject {
     //     private String name;
     //     private int age;
     //     // getters and setters left out for brevity
     // }
     
     if (oldVersion == 0) {
        schema.create("Person")
            .addField("name", String.class)
            .addField("age", int.class);
        oldVersion++;
     }

     // 迁移到版本2:添加主键+对象引用
     // Example:
     // public Person extends RealmObject {
     //     private String name;
     //     private int age;
     //     @PrimaryKey
     //     private int id;
     //     private Dog favoriteDog;
     //     private RealmList<Dog> dogs;
     //     // getters and setters left out for brevity
     // }
     
     if (oldVersion == 1) {
        schema.get("Person")
            .addField("id", long.class, FieldAttribute.PRIMARY_KEY)
            .addRealmObjectField("favoriteDog", schema.get("Dog"))
            .addRealmListField("dogs", schema.get("Dog"));
        oldVersion++;
     }
  }
}

有关更多详细信息,请参见我们的迁移示例App

如果Realm启动时磁盘上没有文件,则不需要迁移,Realm会根据代码中定义的最新models创建一个新的.realm文件和架构。 这意味着,如果您正在开发中并且经常更改架构(并且可以丢失所有数据),则可以删除磁盘上的.realm文件,而不必编写迁移文件。在应用程序开发周期的早期对模型进行修补时,这可能会有所帮助。

RealmConfiguration config = new RealmConfiguration.Builder()
    .deleteRealmIfMigrationNeeded()
    .build()
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章