Основные данные позволяют добавлять несколько постоянных хранилищ в одно имя(каждый с другой конфигурацией), тем самым объединяя их в один NSManagedObjectContext
. То, что я не смог выяснить, - это то, как Core Data обрабатывает атомарность операции сохранения для нескольких магазинов.Основные данные хранилища данных с несколькими магазинами
Скажем, у меня есть два магазина:
NSPersistentStoreCoordinator *coordinator = [[NSPersistentStoreCoordinator alloc] init];
[coordinator addPersistentStoreWithType:type configuration:@"A" URL:aURL options:nil error:NULL];
[coordinator addPersistentStoreWithType:type configuration:@"B" URL:bURL options:nil error:NULL];
NSManagedObjectContext *context = [[NSManageObjectContext alloc] init];
[context setPersistentStoreCoordinator:coordinator];
А потом пришло время, чтобы спасти меня сделать это:
NSError *error = nil;
BOOL result = [context save:&error];
В документации говорится, что последовательность событий будет:
- Сохранить магазин A
- Сохранить магазин B
Что делать, если магазин A сохраняет правильно, но магазин B не может сэкономить по какой-либо причине? (например, файл на диске был удален, или разрешения сделали его доступным только для чтения). Я не могу найти какую-либо документацию, описывающую, будут ли Core Data затем откатывать изменения для сохранения A.
Мне кажется странным, что граф объектов останется в несогласованном состоянии (т. Е. Обновлено одно хранилище) но несколько сложный и ресурсоемкий, чтобы полностью реализовать атомную экономию в нескольких магазинах. Было бы просто очень полезно разъяснить здесь, возможно, у кого-то, у кого больше опыта в системе!
Я еще не пробовал. Я несколько настороженно отношусь к тому, что экспериментальный результат является документированным поведением, поскольку любое изменение в поведении было бы довольно катастрофическим для того, что я планирую! Я надеялся, что кто-то может указать мне на клочок документации по этому вопросу, который я не смог найти в своих поисках. –
Ну, я не могу найти никакой документации. Тогда я планировал бы наихудший сценарий и предполагал, что откат не будет работать над двумя хранилищами данных и не позволит вам каким-то образом обработать код. Вы всегда можете попробовать делать вставки в фиктивные таблицы перед началом большой транзакции, чтобы убедиться, что состояние магазинов в порядке. – Grouchal
@Grouchal - Я не уверен, что тест, который вы предлагаете, будет работать. По умолчанию CoreData будет создавать второй магазин по мере необходимости (если файл был закрыт, как вы предлагаете). Если файл был открыт, файловая система unix отменила бы файл из файловой системы, но в стеке CoreData все равно будет доступ к несвязанному файлу, пока он не будет закрыт. – xyzzycoder