Какое постоянное хранилище используется по умолчанию в основных данных в iPhone - PullRequest
7 голосов
/ 02 августа 2011

Я создаю несколько постоянных хранилищ в своем приложении, но я использую только один постоянный хранилище и модель управляемых объектов.Теперь мой вопрос: когда я вызываю метод save для контекста управляемого объекта, какое постоянное хранилище оно будет использовать для сохранения объекта.Поэтому я хочу указать постоянное хранилище, которое будет использоваться для сохранения объекта.То же самое при извлечении объектов из базы данных, я хочу, чтобы мой запрос на выборку выполнялся в определенном хранилище, чтобы я получал объекты только из этого хранилища.Любая помощь?

Ответы [ 3 ]

5 голосов
/ 30 августа 2012

Вы можете использовать конфигурации.

[PersistentStoreCoordinator addPersistentStoreWithType:configuration:URL:options:nil error:]

Допустим, вы хотите иметь один контекст управляемого объекта, модель одного управляемого объекта, один координатор постоянного хранилища, но два постоянных хранилища, например, первое будет хранилищем SQLite, а второе - оперативной памятью.store.

Для этой настройки вы создаете две конфигурации: «SQLiteStore» для хранилища SQLite и «InMemoryStore» для хранилища в памяти.В XCode (откройте файл .xcdatamodel):

.xcdatamodel file in XCode

вы видите список доступных конфигураций вашей модели управляемых объектов.Конфигурация управляемой объектной модели - это, по сути, набор описаний сущностей, связанных с именем строки.Чтобы добавить конфигурацию, используйте элемент главного меню Редактор -> Добавить конфигурацию , когда у вас открыт файл .xcdatamodel, затем введите желаемое имя строки.Перетащите объекты, которые вы хотите сохранить в первом хранилище SQLite, в конфигурацию «SQLiteStore», а другие в конфигурацию «InMemoryStore».

Хорошо, вот и все, теперь пришло время обновить ваш код.Перейдите в область действия, где вы создадите постоянный координатор хранилища и добавите в него постоянные хранилища.Единственное изменение - указание конфигурации для них:

...
persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:yourManagedObjectModel];
NSURL storeURL = … // your store url
if (![__persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:@"SQLiteStore" URL:storeURL options:nil error:&error])
{
    NSLog(@"[Core Data error] Unresolved error %@, %@", error, [error userInfo]);
    abort();
}    

if (![__persistentStoreCoordinator addPersistentStoreWithType:NSInMemoryStoreType configuration:@"InMemoryStore" URL:nil options:nil error:&error])
{
    NSLog(@"[Core Data error] Unresolved error %@, %@", error, [error userInfo]);
    abort();
} 
...

Вот и все, все сущности, которые вы перетащили в конфигурацию «InMemoryStore», будут автоматически сохранены в постоянном хранилище в памяти, и то же самое касается «SQLiteStore»».Возможно, вам придется переустановить ваше приложение на устройстве / симуляторе после этого.

И быстрое резюме:

  1. Создание конфигураций в редакторе модели управляемых объектов (файл .xcdatamodel);
  2. В коде добавьте несколько постоянных хранилищ в координатор постоянных хранилищ, указав соответствующее имя конфигурации.

Проверьте эту ссылку для получения дополнительной информации: http://developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/CoreData/Articles/cdBasics.html#//apple_ref/doc/uid/TP40001650-SW4

4 голосов
/ 04 августа 2011

Загрузка не должна быть проблемой.Запрос на выборку может быть изменен для поиска в определенных хранилищах с помощью метода setActedStores: для NSFetchRequest.

При создании объекта вы можете назначить сущность определенному хранилищу, используя метод assignObject: toPersisentStore: method onNSManagedObjectContext.

Что касается вашего вопроса, на самом деле не существует механизма по умолчанию, о котором я знаю, и может случиться так, что вам просто нужно установить уязвимые хранилища для всех ваших магазинов:

[request setAffectedStores:[NSArray arrayWithObjects:firstStore,secondStore,thirdStore, nil]];

Чтобы убедиться, что вы ищете во всех нужных местах.

0 голосов
/ 02 августа 2011

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

...