美文网首页收藏征服iOS
Realm数据库版本迁移

Realm数据库版本迁移

作者: ISwiftUI | 来源:发表于2017-02-23 16:07 被阅读1627次

    当你和数据库打交道的时候,你需要改变数据模型(Model),但是因为Realm中的数据模型被定义为标准的Objective-C interfaces,要改变模型,就像改变其他Objective-C interface一样轻而易举。举个例子,假设有个数据模型Person:

    @interface Person : RLMObject
    @property NSString *firstName;
    @property NSString *lastName;
    @property int age;
    @end
    

    当我们想添加一个字段fullName属性而不是first和last names时,我们可以这样做:

    @interface Person : RLMObject
    @property NSString *fullName;
    @property int age;
    @end
    

    接下来执行迁移:

    // Inside your [AppDelegate didFinishLaunchingWithOptions:]
    
    RLMRealmConfiguration *config = [RLMRealmConfiguration defaultConfiguration];
    config.schemaVersion = 1;
    config.migrationBlock = ^(RLMMigration *migration, uint64_t oldSchemaVersion) {
      //如果从没迁移过,oldSchemaVersion == 0
      if (oldSchemaVersion < 1) {
        // The enumerateObjects:block: method iterates
        // over every 'Person' object stored in the Realm file
        [migration enumerateObjects:Person.className
                              block:^(RLMObject *oldObject, RLMObject *newObject) {
    
          // 设置新增属性的值
          newObject[@"fullName"] = [NSString stringWithFormat:@"%@ %@",
                                             oldObject[@"firstName"],
                                             oldObject[@"lastName"]];
        }];
      }
    };
    [RLMRealmConfiguration setDefaultConfiguration:config];
    

    在迁移的过程中重命名属性名称

    // Inside your [AppDelegate didFinishLaunchingWithOptions:]
    
    RLMRealmConfiguration *config = [RLMRealmConfiguration defaultConfiguration];
    config.schemaVersion = 1;
    config.migrationBlock = ^(RLMMigration *migration, uint64_t oldSchemaVersion) {
      // We haven’t migrated anything yet, so oldSchemaVersion == 0
      if (oldSchemaVersion < 1) {
        // The renaming operation should be done outside of calls to `enumerateObjects:`.
        [migration renamePropertyForClass:Person.className oldName:@"yearsSinceBirth" newName:@"age"];
      }
    };
    [RLMRealmConfiguration setDefaultConfiguration:config];
    

    官方eg:

    RLMRealmConfiguration *config = [RLMRealmConfiguration defaultConfiguration];
    config.schemaVersion = 2;
    config.migrationBlock = ^(RLMMigration *migration, uint64_t oldSchemaVersion)
    {
        // enumerateObjects:block: 遍历了存储在 Realm 文件中的每一个“Person”对象
        [migration enumerateObjects:Person.className block:^(RLMObject *oldObject, RLMObject *newObject) {
            // 只有当 Realm 数据库的架构版本为 0 的时候,才添加 “fullName” 属性
            if (oldSchemaVersion < 1) {
                newObject[@"fullName"] = [NSString stringWithFormat:@"%@ %@", oldObject[@"firstName"], oldObject[@"lastName"]];
            }
            // 只有当 Realm 数据库的架构版本为 0 或者 1 的时候,才添加“email”属性
            if (oldSchemaVersion < 2) {
                newObject[@"email"] = @"";
            }
           // 替换属性名
           if (oldSchemaVersion < 3) { // 重命名操作应该在调用 `enumerateObjects:` 之外完成 
                [migration renamePropertyForClass:Person.className oldName:@"yearsSinceBirth" newName:@"age"]; }
        }];
    };
    [RLMRealmConfiguration setDefaultConfiguration:config];
    // 现在我们已经成功更新了架构版本并且提供了迁移闭包,打开旧有的 Realm 数据库会自动执行此数据迁移,然后成功进行访问
    [RLMRealm defaultRealm];
    

    相关文章

      网友评论

        本文标题:Realm数据库版本迁移

        本文链接:https://www.haomeiwen.com/subject/jpsbwttx.html