RLMException, требуется миграция для типа объекта

У меня есть объект NotSureItem, в котором у меня есть три свойства "title", чье имя переименовано из "text" и textDescription, которое я добавил позже, и свойство dateTime. Теперь, когда я собираюсь запустить свое приложение, он падает, когда я хочу добавить что-то к этим свойствам. Он показывает следующие утверждения.

'Для типа объекта NotSureItem требуется миграция из-за следующих ошибок: - Текст свойства отсутствует в последней объектной модели. - Свойство 'title' добавлено к последней объектной модели. - Свойство 'textDescription' было добавлено к последней объектной модели. '

Вот его мой код:

import Foundation
import Realm

class NotSureItem: RLMObject {
    dynamic var title = ""   // renamed from 'text'
    dynamic var textDescription = "" // added afterwards
    dynamic var dateTime = NSDate()
}
+18
источник поделиться
5 ответов

Просто удалите приложение и запустите его снова.

Каждый раз, когда вы изменяете свойства объектов Realm, ваша существующая база данных становится несовместимой с новой.

Пока вы все еще находитесь на стадии разработки, вы можете просто удалить приложение из симулятора/устройства и снова запустить его.

Позже, когда ваше приложение опубликовано и вы измените свойства своих объектов, вам необходимо выполнить переход на новую версию базы данных.

+71
источник

Удалить приложение и переустановить не является хорошей практикой. Мы должны включать некоторые шаги по миграции во время разработки с первого раза, когда мы сталкиваемся с необходимостью миграции. Ссылка, предоставленная SilentDirge, хороша: документ миграции области, который дает хорошие примеры для обработки различных ситуаций.

Для минимальной задачи миграции следующий фрагмент кода из приведенной выше ссылки может автоматически выполнить миграцию и должен использоваться с методом AppDelegate disFinishLaunchWithOptions:

let config = Realm.Configuration(
  // Set the new schema version. This must be greater than the previously used
  // version (if you've never set a schema version before, the version is 0).
  schemaVersion: 1,

  // Set the block which will be called automatically when opening a Realm with
  // a schema version lower than the one set above
  migrationBlock: { migration, oldSchemaVersion in
    // We haven’t migrated anything yet, so oldSchemaVersion == 0
    if (oldSchemaVersion < 1) {
      // Nothing to do!
      // Realm will automatically detect new properties and removed properties
      // And will update the schema on disk automatically
    }
  })

// Tell Realm to use this new configuration object for the default Realm
Realm.Configuration.defaultConfiguration = config

// Now that we've told Realm how to handle the schema change, opening the file
// will automatically perform the migration
let _ = try! Realm()
+8
источник

Ниже код работает для меня

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{  
RLMRealmConfiguration *config = [RLMRealmConfiguration    defaultConfiguration];
 config.schemaVersion = 2;
config.migrationBlock = ^(RLMMigration *migration, uint64_t  oldSchemaVersion) {
  // The enumerateObjects:block: method iterates
  // over every 'Person' object stored in the Realm file
  [migration enumerateObjects:Person.className
                    block:^(RLMObject *oldObject, RLMObject *newObject) {
    // Add the 'fullName' property only to Realms with a schema version of 0
    if (oldSchemaVersion < 1) {
      newObject[@"fullName"] = [NSString stringWithFormat:@"%@ %@",
                            oldObject[@"firstName"],
                            oldObject[@"lastName"]];
    }

    // Add the 'email' property to Realms with a schema version of 0 or 1
    if (oldSchemaVersion < 2) {
     newObject[@"email"] = @"";
    }
  }];
 };
[RLMRealmConfiguration setDefaultConfiguration:config];

// now that we have updated the schema version and provided a migration block,
// opening an outdated Realm will automatically perform the migration and
// opening the Realm will succeed
[RLMRealm defaultRealm];

return YES;
}

Дополнительная информация: https://realm.io/docs/objc/latest/#getting-started

+5
источник

Измененная база данных больше не совместима с сохраненной базой данных, поэтому требуется миграция. Ваши параметры состоят в том, чтобы удалить старый файл базы данных и начать новый (отлично работает, если вы находитесь в начальной фазе dev), или если вы живы, выполните миграцию.

Вы делаете это, определяя версию схемы и предоставляя миграцию базы данных "script" в вашей конфигурации Realm. Весь процесс документирован здесь (вместе с образцами кода): здесь

+3
источник

Вы можете удалить базу данных при запуске следующим образом:

[[NSFileManager defaultManager] removeItemAtURL:[RLMRealmConfiguration defaultConfiguration].fileURL error:nil];
+2
источник

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