Сбой миграции в области: "Требуется миграция"

Я добавляю новые свойства к модели. Но некоторые ошибки в 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.

Таким образом, я изменил migrationBlock:

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.

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

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

0
источник поделиться
1 ответ

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

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

0
источник

Посмотрите другие вопросы по меткам или Задайте вопрос