领域反应本机模式版本控制

问题描述 投票:0回答:2

我在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}
            ]);

但这对于新安装可能会崩溃。

react-native realm
2个回答
0
投票

您应该为所有数据库设置全局

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;
});

迁移成功完成后,领域及其所有内容 您的应用程序可以照常访问对象。


0
投票

我知道这是一个老问题,从那时起,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
提供的所有自定义挂钩。

我希望这有帮助!

© www.soinside.com 2019 - 2024. All rights reserved.