Основные сведения о новичках Cocoa Core Data - PullRequest
10 голосов
/ 11 ноября 2009

Я один из огромного количества немытых разработчиков .NET, стремящихся попробовать свои силы в разработке под Mac OS X. В данный момент я пытаюсь выяснить различные элементы какао и немного застреваю в базовых данных.

Я заметил, что большинство документации и ресурсов, доступных в Интернете, включают в себя обширное сквозное руководство, начиная с моделей, создания классов, пользовательского интерфейса на основе документов и т. Д. по крайней мере, недостаточно примеров.

Может ли кто-нибудь указать мне правильное направление, будь то онлайн-материалы или книги, которые могут дать мне подробные инструкции по различным битам? Может быть, я застрял в мире .NET, но я все еще думаю о уровне доступа к данным и т. Д. Я хотел бы знать основы "CRUD", при настройке постоянного хранилища, создании объекта, редактировании, сохранении хранить и т. д. Просто основы, без уточнения интерфейса. Также было бы неплохо, если бы я мог провести модульное тестирование различных битов.

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

Большое спасибо, Дэни.

Ответы [ 6 ]

15 голосов
/ 11 ноября 2009

Во-первых, как утверждается в документации 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-хранилищ весь граф хранится в памяти

8 голосов
/ 11 ноября 2009

Я бы выбрал следующий маршрут:

  1. Сделайте общее руководство Apple Cocoa: Конвертер валют
  2. Далее, погрузитесь в версию привязок какао этого руководства (привязки очень удобны и очень важны, если вы переходите к базовым данным)
  3. Какао Dev Central's "Построить ядро Data App " учебник

Дальнейшее чтение:
Как всегда: книга Программирование какао для Mac OS X
Архитектура приложений на основе документов (АЦП)
И наконец: сравнение между некоторыми аспектами Какао и .net

5 голосов
/ 12 ноября 2009

Базовые данные на самом деле не являются уровнем доступа к данным (см. Мой другой ответ для получения дополнительной информации). Но что, если вы хотите уровень доступа к данным для Какао? Какие у вас варианты? Я профессиональный разработчик какао и Qt, и до сих пор мне удалось избежать корпоративного мира Windows или Java, поэтому моя оценка вариантов может не соответствовать вашей. Исходя из корпоративной экосистемы, я ожидаю, что вы найдете варианты немного пугающими. Я заказал их в том, что, как я ожидаю, будет для вас наименее страшным (примерно, по крайней мере, Cocoa-y, а также, по-видимому, наиболее малоизвестным для меня). Найдите в списке место, где ваш желудок перестает колотиться, и вы нашли свое решение ...

  1. Хотя Core Data является очень мощной средой для управления графом объектов компонента модели архитектуры MVC, вы не обязаны его использовать. Вы можете написать свой собственный слой модели и по-прежнему играть в мире Cocoa MVC. Вот как мы сделали это до Core Data. Вы все еще можете использовать Какао NSObjectController, NSArrayController и NSTreeController, если хотите. Таким образом, вы можете прокрутить свой собственный уровень доступа к данным, используя собственные API C / C ++ вашего поставщика базы данных.

  2. Фреймворк BaseTen представляет собой коммерчески лицензированный API-интерфейс Core Data-like поверх бэкэнда PostgreSQL. Это действительно больше ORM, чем структура управления графами объектов, такая как Core Data, но API похож. Насколько я понимаю, он может обрабатывать существующую (произвольную) схему или использовать модели управляемых объектов Core Data. Они предоставляют собственный подкласс NSArrayController, который можно использовать в качестве замены вместо контроллера массива Cocoa. Я никогда не использовал BaseTen лично, поэтому я не могу говорить с его утилитой, но я слышал хорошие вещи. Насколько я знаю, это только PostgreSQL.

  3. Мост Python-Objective-C, называемый PyObjC, является достаточно зрелым и поставляется с OS X с 10.5. Используя этот мост, вы можете написать законченные приложения Какао на Python или написать гибридное приложение Python / Objective-C. Используя PyObjC, вы можете использовать любой из ORM Python, например SQLAlchemy , для реализации уровня модели. Опять же, не работа, но, возможно, все еще относительно легко для компетентного программиста Python и Cocoa.

  4. Корпоративная объектная платформа Apple, являющаяся частью WebObjects, теперь представляет собой Java ORM, в состав которого входит ORM Objective-C. Я считаю, что вы все еще можете писать настольные приложения, используя WebObjects. Я понимаю, что многие модели Какао переносятся, но это совсем другой зверь. Я никогда не писал код WebObjects, поэтому я не могу дать вам гораздо больше советов по этому вопросу.

  5. Вы можете использовать кроссплатформенный инструментарий. Qt может создавать достойно выглядящие пользовательские интерфейсы Mac (хотя см. Ниже). Qt также имеет платформу уровня модели, которая включает поддержку SQL для нескольких баз данных в модуле QtSql . Qt совсем не Какао . Пользователи Savy Mac не любят не родные приложения. Qt примерно так же хорош, как и для кроссплатформенности в OS X, но он не идеален. Если вы можете остаться родным, сделайте это.

  6. Любое дерьмо Java Swing / SWT. Опять же, это мощная штука, но на Mac она выглядит чертовски, и пользователям это не нравится.

  7. Mono в OS X является относительно незрелым, и я не знаю, каково состояние любого из .Net ORM в Mono. Это то, на что стоит взглянуть. Что касается пользовательского интерфейса, вещи Mono-GTK выглядят довольно плохо на OS X. Существует привязка C # для Qt, называемая Qyoto, которая работает на Mono.

4 голосов
/ 11 ноября 2009

Похоже, никто еще не упомянул эти книги:

  • Основные данные Маркус Зарра, Прагматичные программисты
  • Базовые данные для iPhone Тимом Истедом, Аддисон-Уэсли (да, это книга для iPhone, но большинство принципов Базовых данных распространены на разных платформах)
1 голос
/ 11 ноября 2009

Тем не менее, вы можете найти полезными Apple Core Data Basics - здесь также есть руководство по созданию утилиты без GUI.

0 голосов
/ 16 ноября 2013

Apple продает бытовую технику и товары знаменитостей (Голливуд) они не имеют ничего общего с развитием предприятия какао было заброшено еще до того, как его закончили для оппортунистического прикосновения какао если вы ищете что-то на уровне delphi / vcl или .net, удачи вам (у них ничего такого нет)

п.с. Вот почему у Apple нет слов на стороне сервера и / или корпоративного рабочего стола, то есть у них нет подсказки, и они никогда не будут. то есть они в другом бизнесе. даже их внутренние системы основаны на Linux (просто чтобы вы знали!)

...