在这一节中,我们学习了如何更新 Realm 数据库中的表结构,以及如何在不破坏已有数据的情况下进行表结构迁移。
1. 为什么需要更新表结构
在开发过程中,表结构的修改是很常见的,比如需要添加新字段、删除旧字段,或者修改已有字段。如果直接修改表结构,原有数据可能会导致异常。特别是在应用已经上线后,直接修改表结构可能会影响到已存储的数据。
2. 更新表结构时如何处理已存数据
当我们新增字段(例如添加 rate 字段)时,需要确保迁移已有数据。比如,数据库中以前没有 rate 字段,我们要计算并为旧数据赋值新的字段。直接修改字段可能会导致应用崩溃。
class Program {
currentTime = 0;
duration = 0;
static schema = {
name: 'Program',
primaryKey: 'id',
properties: {
id: 'string',
title: 'string',
thumbnailUrl: 'string',
currentTime: {type: 'double', default: 0},
duration: {type: 'double', default: 0},
rate: {type: 'double', default: 0},
},
};
}
3. 使用版本号和迁移策略
为了处理表结构的更新,Realm 引入了版本号机制。在每次创建 Realm 实例时,指定一个版本号。如果版本号发生变化,Realm 会触发数据迁移的过程。迁移策略通过 migration 属性进行定义,确保数据在迁移时不会丢失或者发生错误。
const realm = new Realm({
schema: [Program],
schemaVersion: 1, // 新的版本号
migration: (oldRealm, newRealm) => {
if (oldRealm.schemaVersion < 1) {
const oldObjects = oldRealm.objects('Program');
const newObjects = newRealm.objects('Program');
for (let i = 0; i < oldObjects.length; i++) {
newObjects[i].rate = Math.floor(((oldObjects[i].currentTime * 100) / oldObjects[i].duration) * 100) / 100;
}
}
}
});
在迁移过程中,我们通过 oldRealm 获取到旧版本的数据,通过 newRealm 进行迁移,并为旧数据计算并赋值新字段的值。
4. 迁移完成后查看效果
通过这种迁移方法,即使在应用上线后修改表结构,我们也能保证已有数据能够无缝过渡到新的结构,同时为新数据提供新的字段。
总结
在这一节中,我们学习了如何使用 Realm 的版本号和迁移策略来更新数据库表结构,而不影响已有数据。通过这种方式,我们可以在不清空数据的情况下,修改数据库结构并保持数据一致性。
下一节我们将开始完成 "发现模块" 的功能。