假定初始定义的数据模型 为
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]);
上述方式为线性迁移。可以保证不同版本的用户同步更新为最新版本数据库。