React-native Realm 数据迁移

假定初始定义的数据模型 为

const HomeScenicScheme = {
    name: 'HomeScenic',
    primaryKey: 'id',
    properties: {
        id: 'int',
        title: 'string',
        sub_title: 'string',
    }
};

现业务更改

const HomeScenicScheme = {
    name: 'HomeScenic',
    primaryKey: 'id',
    properties: {
        id: 'int',
        title: 'string',
        sub_title: 'string?',
        type: 'int',
    }
};

也就是新增了type 字段,同时将sub_title 设置为字符串或其他。

此时新代码与Realm在磁盘上存储的旧数据之间将存在不匹配。此时如果使用新的数据模型打开原有已存储得数据库文件,必然会闪退。这是则必须进行数据迁移。
(本文数据库模型修改,只牵扯到新增和删除,)可以通过更新schemaVersion (累加),并定义migration函数(可选),来迁移数据。

const HomeScenicScheme = {
    name: 'HomeScenic',
    primaryKey: 'id',
    properties: {
        id: 'int',
        total_title: 'string',
        type: 'int',
    }
};

假如出现上述,total_title = title + subtitle 时,则需要在migration函数中实现。

var realm = new Realm({
  schema: [HomeScenicScheme],
  schemaVersion: 1,
  migration: (oldRealm, newRealm) => {
    // 只有当schemaVersion小于1的时候才会执行if中代码
    if (oldRealm.schemaVersion < 1) {
      const oldObjects = oldRealm.objects('HomeScenic');
      const newObjects = newRealm.objects('HomeScenic');

      // 遍历所有对象,并将新的模型中设置属性
      for (let i = 0; i < oldObjects.length; i++) {
        newObjects[i].total_title = oldObjects[i].title + oldObjects[i].sub_title
      }
    }
  }
}).then(realm => {
  const newBook = realm.objects('Book')[0].time;
});

当没有数据库时 schemaVersion为-1,没有指定版本时,schemaVersion 默认为0 。

var schemas = [
    {
        schema: [HomeScenicScheme],
        schemaVersion: 1,
        migration: () => {}
    },
 {
        schema: [HomeScenicScheme,newScheme],
        schemaVersion: 2,
        migration: () => {}
    },

]

let nextSchemaIndex = Realm.schemaVersion(Realm.defaultPath);

if (nextSchemaIndex != -1) {
    while (nextSchemaIndex < schemas.length) {
      //  var migratedRealm = new Realm(schemas[nextSchemaIndex++]);
     //   migratedRealm.close();
 const migratedRealm = new Realm({ ...schemas[nextSchemaIndex] });
  nextSchemaIndex += 1;
  migratedRealm.close();
    }
}
var realm = new Realm(schemas[schemas.length - 1]);

上述方式为线性迁移。可以保证不同版本的用户同步更新为最新版本数据库。

    原文作者:_海角_
    原文地址: https://www.jianshu.com/p/38cc33fcd54f
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞