我最近将我的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:
答案 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:]