领域迁移和可选属性

时间:2015-11-07 17:10:34

标签: objective-c realm

我最近将我的Realm库从0.92(我认为)升级到0.96.2,但是对“可选”属性的新支持遇到了一些问题。我还需要第一次进行迁移,这也使事情变得复杂。

新方案需要向其中一种数据类型添加单个字段,因此我编写了一个迁移,在现有对象上建立了这个新属性:

RLMRealmConfiguration* config = [RLMRealmConfiguration defaultConfiguration];
config.schemaVersion = 1;
config.migrationBlock = ^(RLMMigration* migration, uint64_t oldSchemaVersion)
{
    [migration enumerateObjects:Foo.className
                          block:^(RLMObject* oldObject, RLMObject* newObject) {
                              if (oldSchemaVersion < 1)
                              {
                                newObject[@"user"] = @"";
                              }
                          }];
};
[RLMRealmConfiguration setDefaultConfiguration:config];

但是,只要代码尝试打开Realm,我就会收到有关可选属性类型的错误消息:

'Migration is required for object type 'Person' due to the following errors:
- Property 'name' has been made optional.
- Property ‘company’ has been made optional.
- Property 'title' has been made optional.
- Property 'phone' has been made optional.
- Property 'email' has been made optional.
- Property 'homeAddress' has been made optional.'

问题#1 - 由于模型从“必需”属性变为“可选”,因此保证已存在现有对象的值;所以我很难理解为什么迁移是必需的

问题#2 - 我仍然喜欢来迁移对象,如果字符串为空则忽略属性,所以我编写了一个迁移:< / p>

RLMRealmConfiguration* config = [RLMRealmConfiguration defaultConfiguration];
config.schemaVersion = 1;
config.migrationBlock = ^(RLMMigration* migration, uint64_t oldSchemaVersion)
{
    NSLog(@"RUNNING REALM MIGRATION");

    // ...basic migration of adding a new property (above)

    [migration enumerateObjects:Person.className
                          block:^(RLMObject* oldObject, RLMObject* newObject) {
                              if (oldSchemaVersion < 1)
                              {
                                  if ([oldObject[@"name"] length] == 0)
                                      newObject[@"name"] = nil;
                                  else
                                      newObject[@"name"] = oldObject[@"name"];

                                  // … repeat for other properties
                }
                          }];
};
[RLMRealmConfiguration setDefaultConfiguration:config];

但是,迁移似乎没有运行;永远不会点击if (oldSchemaVersion < 1)块内的断点,并且"RUNNING REALM MIGRATION"消息永远不会打印。

外部区块 - 设置RLMRealmConfiguration - 位于application:didFinishLaunchingWithOptions:

2 个答案:

答案 0 :(得分:1)

问题#1 默认情况下,所有属性都被指定为“必需”&#39;在0.96之前的Realm版本中。在0.96中,它们被标记为“可选&#39;默认情况下。因此,由于新的底层文件格式的变化以适应这种情况(相对非平凡的变化),因此需要迁移才能将这些先前需要的属性转换为可选属性。

如果要根据需要保留这些属性,可以通过覆盖[RLMObject requiredProperties]方法来定义它。

问题2 嗯......查看示例代码,它建议您将枚举语句封装在if (oldSchemaVersion < 1)条件块中,而不是相反。可能导致事情无序发生。你有没有试过交换它?

如果有帮助,请告诉我! :)

答案 1 :(得分:0)

问题似乎是我使用迁移信息设置了默认RLMRealmConfiguration,但[RLMRealm realmWithPath:]忽略了默认配置。

您可以复制默认配置(包括realmWithPath:migrationBlock),设置schemaVersion属性,并将其传递给{{1>,而不是使用path。 }}

[RLMRealm realmWithConfiguration:error:]