Во-первых, как утверждается в документации Apple (и в постоянных комментариях инженеров Apple), Core Data - это «продвинутая» технология какао. Базовые данные Grokking требуют знания множества парадигм и моделей какао. Серьезно, сначала изучите Какао. Затем напишите проект (или несколько) без Core Data. Затем изучите основные данные. Серьезно.
Чтобы успокоить ваше любопытство, я сделаю удар по ответу CRUD, хотя это не будет ответ, который вы хотите. Ответ в том, что для Core Data нет шаблона CRUD, по крайней мере, не так, как вы о нем думаете. Причина в том, что Core Data не является уровнем доступа к данным. Это структура управления графами объектов. Это означает, что явное, предназначенное задание Core Data - управлять графом экземпляров объектов. Этот график имеет ограничения (такие как количество связей или ограничения на отдельные атрибуты экземпляра) и правила каскадных изменений (таких как удаление) через график. Core Data управляет этими ограничениями. Поскольку граф объекта может быть слишком большим для хранения в памяти, Core Data предоставляет интерфейс для графа вашего объекта, который имитирует [1] весь граф объекта в памяти посредством сбоя (экземпляры объекта не являются «сбоями», когда их сначала вводят в управляемый контекста объекта и «запускаются», чтобы заполнить их атрибуты из постоянного хранилища лениво) и uniquing (в контексте создается только один экземпляр в памяти конкретного экземпляра сущности (в постоянном хранилище).
Базовые данные просто случается при использовании постоянного хранилища на диске для реализации интерфейса большого графа объектов. В случае постоянного хранилища SQLite эта реализация просто происходит с использованием SQL-совместимой базы данных. Это деталь реализации, однако. Например, вы можете создать постоянное хранилище в памяти, которое ничего не сохраняет на диске, но позволяет Core Data управлять графом объектов как обычно. Таким образом, Core Data на самом деле не является уровнем доступа к данным. Думать об этом в этих терминах будет не хватать его истинной силы и приведет к разочарованию. Вы не можете использовать Core Data с произвольной схемой базы данных (именно поэтому все учебные пособия Core Data начинаются с создания NSManagedObjectModel). Вы не должны использовать Базовые Данные как постоянную среду и использовать отдельный уровень модели; вам следует использовать Core Data в качестве слоя модели и использовать способность Core Data сохранять граф объектов объекта на диск для вас.
Тем не менее, для создания NSManagedObjectContext
(который обеспечивает интерфейс графа объектов, который я описал выше):
NSManagedObjectModel *mom = [NSManagedObjectModel mergedModelFromBundles:[NSArray arrayWithObject:[NSBundle mainBundle]]]; // though you can create a model on the fly (i.e. in code)
NSPersistentStoreCoordinator *psc = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:mom];
NSError *err;
// add an in-memory store. At least one persistent store is required
if([psc addPersistentStoreWithType:NSInMemoryPersistentStore configuration:nil URL:nil options:nil error:&err] == nil) {
NSLog(@"%@",err);
}
NSManagedObjectContext *moc = [[NSManagedObjectContext alloc] init];
[moc setPersistentStoreCoordinator:psc];
(обратите внимание, что я предполагаю, что вы используете сборщик мусора; этот код просачивается в среду ручного управления памятью).
Чтобы добавить экземпляр сущности (начиная с moc
сверху):
NSEntityDescription *entity = [NSEntityDescription entityForName:@"MyEntity" inManagedObjectContext:moc];
//entity will be nil if MyEntity doesn't exist in moc.persistentStoreCoordinator.managedObjectModel
NSManagedObject *obj = [[NSManagedObject alloc] initWithEntity:entity insertIntoManagedObjectContext:moc];
Обратите внимание, что вам необходимо описание сущности для создания управляемого объекта (почему учебные пособия начинаются с модели) и что вы не можете создать управляемый объект без контекста управляемого объекта.
Чтобы обновить экземпляр сущности:
[obj setValue:myValue forKey:@"attributeKey"]; //or use any method on `obj` that updates its state
NSError *err;
if(![moc save:&err]) {
NSLog(@"%@", err); // an erro occurred in saving, perhaps due to optimistic locking failure
}
Чтобы удалить экземпляр сущности:
[moc deleteObject:obj];
if(![moc save:&err]) {
NSLog(@"%@", err); // an erro occurred in saving, perhaps due to optimistic locking failure
}
[1]: для постоянных бинарных или XML-хранилищ весь граф хранится в памяти