Подтвердить что ты не робот

Добавить индекс основных данных в определенные атрибуты с помощью миграции

По соображениям производительности я хочу установить Индексированный атрибут для некоторых моих объектов. Я создал новую версию модели данных ядра для выполнения изменений. Core Data обнаруживает изменения и переносит мою модель на новую версию, однако НЕТ ПОКАЗАТЕЛЕЙ ОБРАТИТЕСЬ.

Если я воссоздаю базу данных с нуля, там будут индексы. Я проверил с помощью SQLite Browser как на iPhone, так и на Simulator. Проблема возникает только в том случае, если база данных в предыдущем формате уже существует.

Есть ли способ вручную добавить индексы? Напишите для этого несколько sql? Или я чего-то не хватает? У меня уже были более критические миграции, никаких проблем нет. Но те недостающие индексы меня подталкивают.

Спасибо за помощь!

4b9b3361

Ответ 1

У меня была та же проблема.

В соответствии с Руководство по управлению версиями и переносом данных с базовыми данными:

Перспектива Core Datas при управлении версиями заключается в том, что его интересует только особенности модели, которые влияют настойчивость.

Просто добавление индекса к существующему свойству модели автоматически не инициирует миграцию, поскольку Core Data не видит, что ваши две модели моделей различаются (индекс не влияет на постоянство).

Тем не менее, вы можете заставить Core Data увидеть вашу модель как измененную, добавив модификатор модификации версии Hash к вашему новому индексированному атрибуту. Это вызвало легкий перенос для обновления существующих баз данных.

Ответ 2

Какую стратегию вы использовали?

В XCode вы можете сгенерировать модель сопоставления и просмотреть изменения, которые будут происходить, включая индексирование.

Я предлагаю просто добавить модель сопоставления, уточнить изменения индекса и выполнить автоматическую легкую миграцию:

NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:
    [NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption,
    [NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption,nil];
NSPersistentStore *migratedStore = [persistentStoreCoordinator addPersistentStoreWithType:nil configuration:nil URL:storeURL options:options error:&error];
migrationWasSuccessful = (migratedStore != nil);

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