Добавьте индекс основных данных к определенным атрибутам посредством миграции - PullRequest
25 голосов
/ 01 февраля 2010

По соображениям производительности я хочу установить Индексированный атрибут для некоторых из моих сущностей. Я создал новую версию модели данных ядра для внесения изменений. Базовые данные обнаруживают изменения и переносят мою модель в новую версию, однако НЕ УКАЗАНЫ ИНДЕКСЫ .

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

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

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

Ответы [ 2 ]

51 голосов
/ 06 июля 2010

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

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

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

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

Однако вы можете заставить Базовые Данные видеть вашу модель как измененную, добавив Модификатор Хэша Версии в ваш недавно проиндексированный атрибут. Это вызвало облегченную миграцию для обновления моих существующих баз данных.

0 голосов
/ 30 марта 2010

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

В 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);

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...