Realm会对本机模式版本进行反应

时间:2018-06-07 13:27:34

标签: react-native realm

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

但是这可能会因新安装而崩溃。

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及其全部   您的应用可以像往常一样访问对象。