我在realm.js文件中有以下2个模式
class Bill extends Realm.Object {}
Bill.schema = {
name: 'Bill',
primaryKey: 'id',
properties: {
id: { type: 'string', indexed: true },
year: 'int',
month: 'int',
description: 'string',
dateCreated: 'int',
}
};
class User extends Realm.Object {}
User.schema = {
name: 'User',
primaryKey: 'id',
properties: {
id: 'string',
name: 'string?',
email: 'string?'
}
};
const realm = new Realm({schema: [Bill, User]});
export default realm;
当我第一次将我的应用程序发布到AppStore或PlayStore时,这非常有效。 我需要再次更改架构和发布到AppStore或PlayStore,我需要处理我的应用程序的新安装或更新,其中架构更改为以下
class Bill extends Realm.Object {}
Bill.schema = {
name: 'Bill',
primaryKey: 'id',
properties: {
id: { type: 'string', indexed: true },
year: 'int',
month: 'int',
description: 'string',
dateCreated: 'int',
dateDeleted: 'int',
}
};
class User extends Realm.Object {}
User.schema = {
name: 'User',
primaryKey: 'id',
properties: {
id: 'string',
name: 'string?',
email: 'string?',
photoUrl: 'string?',
}
};
在每个架构中再添加一个字段。
那么我应该如何配置我的领域架构版本?
我应该如下配置:
const realm = new Realm([
{schema: Bill, schemaVersion: 1},
{schema: User, schemaVersion: 1}
]);
但是这可能会因新安装而崩溃。
答案 0 :(得分:-1)
您应该为所有数据库设置全局schemaVersion
,而不是为每个模型设置全局Realm.open({
schema: [PersonSchema],
schemaVersion: 1,
migration: (oldRealm, newRealm) => {
// only apply this change if upgrading to schemaVersion 1
if (oldRealm.schemaVersion < 1) {
const oldObjects = oldRealm.objects('Person');
const newObjects = newRealm.objects('Person');
// loop through all objects and set the name property in the new schema
for (let i = 0; i < oldObjects.length; i++) {
newObjects[i].name = oldObjects[i].firstName + ' ' + oldObjects[i].lastName;
}
}
}
}).then(realm => {
const fullName = realm.objects('Person')[0].name;
});
。并执行迁移到当前版本,如the docs中所述:
您可以通过更新来定义迁移和关联的架构版本 schemaVersion并定义可选的迁移功能。您的 迁移功能提供转换数据模型所需的任何逻辑 从以前的模式到新模式。当打开一个王国时 将应用迁移函数将Realm更新为给定的 仅在需要迁移时才构建模式版本。
如果没有提供迁移功能,那么任何新属性都可以 自动添加和旧属性将从数据库中删除 更新到新的schemaVersion时。如果你需要更新旧的或 在升级版本时填充新属性,您可以执行此操作 迁移功能。例如,假设我们要迁移 之前宣布的人物模型。您可以填充名称属性 使用旧的firstName和lastName属性的新架构:
SELECT Field1, SUM(Field2+Field3+Field4) AS AggNum FROM Table1 WHERE Filter1 IN ('a') AND Filter2 IN ('x','y') OR (Filter2 IN ('z') AND Filter3 IN ('xxx') GROUP BY Field1
迁移成功完成后,Realm及其全部 您的应用可以像往常一样访问对象。