我在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}
]);
但这对于新安装可能会崩溃。
您应该为所有数据库设置全局
schemaVersion
,而不是为每个模型设置。并执行到当前版本的迁移,如文档中所述:
您可以通过更新来定义迁移和关联的架构版本 schemaVersion 并定义可选的迁移函数。你的 迁移功能提供转换数据模型所需的任何逻辑 从以前的模式到新的模式。当打开一个 Realm 时 迁移函数将应用于将 Realm 更新为给定的 仅当需要迁移时才使用架构版本。
如果没有提供迁移函数,则任何新属性都会 自动添加并从数据库中删除旧属性 更新到新的 schemaVersion 时。如果您需要更新旧的或 升级版本时填充新属性,您可以在 迁移函数。例如,假设我们要迁移 之前声明的人物模型。您可以填充 name 属性 使用旧的firstName和lastName属性的新模式:
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; });
迁移成功完成后,领域及其所有内容 您的应用程序可以照常访问对象。
我知道这是一个老问题,从那时起,Realm 已经有了很大的发展,但是对于任何刚来并且在定义模式或迁移方面遇到困难的人来说,React Native 中的 Realm 应该在
<RealmProvider />
中定义,并且它应该至少收到以下 props:架构配置和架构版本。
这是我在 React Native 应用程序中声明我的 Realm 的方式。
在
App.js
我这样定义RealmProvider:
<RealmProvider {...realmConfig} deleteRealmIfMigrationNeeded={false}>
//other components, Router, etc
</RealmProvider>
说明:
deleteRealmIfMigrationNeeded
:这在开发时可能很有用,因为它可以确保每当您更改架构时您的领域都会被清除。在生产中,您绝对应该将其保留为 false
,否则您将面临丢失整个数据库的风险。
realmConfig
是一个接收 schema
和 schemaVersion
数组的对象,如下所示:
// import User, Bill
const schemas = [
User.schema, // notice you pass only the schema to the array
Bill.schema, // not the entire model/entity
]
export const realmConfig = {
schema: schemas,
schemaVersion: 1 // this could be any positive integer, but it MUST be incremented every time there is a schema change, even if you don't need a migration function
}
因此请注意,整个 Realm 的领域配置仅采用 Schema 数组,而不是每个模型的单独对象,并且 schemaVersion 是 Realm 范围的,而不是 schema 范围的。您的整个 Realm 实例都有一个特定的 schemaVersion。您绝对可以添加更多 Realm 实例并手动管理它们,但是拥有一个实例非常好,因为您可以使用
@realm/react
提供的所有自定义挂钩。
我希望这有帮助!