Ошибка миграции области: «Требуется миграция» - PullRequest
0 голосов
/ 13 мая 2018

Я добавляю новые свойства в модель, но некоторые ошибки Realm меня сбивают с толку. Первым делом я попытался изменить свойство regDate (NSString) на тип NSDate.

RLMRealmConfiguration *config = [RLMRealmConfiguration defaultConfiguration];
config.schemaVersion = 2;

config.migrationBlock = ^(RLMMigration *migration, uint64_t oldSchemaVersion) {
    NSLog(@"========== Migration executed ==========");
    if (oldSchemaVersion < 2) {
        [migration enumerateObjects:Track.className block:^(RLMObject *oldObject, RLMObject *newObject) {
            NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
            [dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
            newObject[@"regDate"] = [dateFormatter dateFromString:oldObject[@"regDate"]];
        }];
    }
};
[RLMRealmConfiguration setDefaultConfiguration:config];
[RLMRealm defaultRealm];

и я тоже изменился Track.h.

@property NSString *regDate; стало @property NSDate *regDate;

Но я получил ошибку во время выполнения, как это

*** Terminating app due to uncaught exception 'RLMException',
reason: 'Migration is required due to the following errors:
- Property 'Track.regDate' has been changed from 'string' to 'date'.

Причина говорит Требуется миграция . Однако блок миграции никогда не выполнялся.

Я думал, что нет другого выбора, кроме как создать новое свойство из старого объекта и принять это бесполезное свойство regDate.

Итак, я изменил миграционный блок:

config.migrationBlock = ^(RLMMigration *migration, uint64_t oldSchemaVersion) {
    if (oldSchemaVersion < 2) {
        // Note: Even if you don't have to convert placeholder values,
        // you still have to provide at least an empty migration block
        // when your schema has changes to nullability of properties.
        [migration enumerateObjects:Track.className block:^(RLMObject *oldObject, RLMObject *newObject) {
            NSLog(@"========== Migration executed ==========");
            NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
            [dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
            newObject[@"n_regDate"] = [dateFormatter dateFromString:oldObject[@"n_regDate"]];
        }];
    }
};

и добавлено @property NSDate *n_regDate;

Ошибка была:

*** Terminating app due to uncaught exception 'RLMException', reason: 'Migration is required due to the following errors:
- Property 'Track.n_regDate' has been added.

и на этот раз блок миграции тоже не работал.

Кажется, я что-то упустил. Документы и ошибки не помогают понять, что происходит.

1 Ответ

0 голосов
/ 13 мая 2018

Я решил проблему, обновив Realm 3.1.1 до 3.5.0

Я не знаю, является ли это ошибкой.Однако, если кто-то использует версию 3.1.1, я рекомендую обновить.

...