Cocoa Core Data新手怎么样

cod*_*dog 10 .net cocoa core-data cocoa-bindings

我是伟大的未经洗涤的.NET开发人员之一,他们热衷于尝试Mac OS X开发.目前我正在试图找出Cocoa的各种元素并且在Core Data上有点卡住了.

我注意到Web上可用的大部分文档和资源都涉及广泛的端到端教程,从模型,生成类,基于文档的UI等开始.似乎没有足够的重点放在每个位上,或者至少不是足够的例子.

有人可以指出我正确的方向,无论是在线材料还是书籍,能给我详细的各种指示?也许我陷入了.NET世界,但我仍然在数据访问层等方面思考.我想知道"CRUD"的基础知识,设置持久存储,创建实体,编辑,保存存储等等只是基础知识,没有详细说明用户界面.如果我可以对各个位进行单元测试,那也很好.

我想我正试图在这里进入正确的思维模式 - 那里的任何.NET开发人员都知道适合我们这样看待Cocoa编程的人的阅读材料吗?

非常感谢,Dany.

Bar*_*ark 15

首先,正如Apple的文档(以及Apple工程师反复发表的评论)所述,Core Data是一种"先进的"Cocoa技术.Grokking Core Data需要了解很多Cocoa范例和模式.说真的,先学习Cocoa.然后编写一个没有核心数据的项目(或几个).然后学习核心数据.认真.

为了安抚你的好奇心,我会尝试CRUD的答案,虽然这不是你想要的答案.答案是核心数据没有CRUD模式,至少不是你想象的那样.原因是Core Data不是数据访问层.它是一个对象图管理框架.这意味着Core Data 的明确的预期工作是管理对象实例的图形.此图表具有约束(例如关系的基数或对各个实例属性的约束)以及通过图形进行级联更改(例如删除)的规则.核心数据管理这些约束.因为对象图可能太大而无法存储在内存中,所以Core Data为对象图提供了一个接口,它通过错误模拟[1]内存中的整个对象图(对象实例在首次进入托管时不是"错误"对象上下文和被"击发"到懒惰地从持久存储填充它们的属性)和uniquing(特定实体实例(在持久存储中的仅一个在存储器的实例)中的上下文中创建的).

核心数据恰好使用磁盘上的持久存储来实现大对象图的接口.对于SQLite持久性存储,此实现恰好使用SQL兼容的数据库.但是,这是一个实现细节.例如,您可以创建一个内存持久性存储,该存储不会将任何内容持久保存到磁盘,但允许Core Data像往常一样管理对象图.因此,核心数据实际上不是数据访问层.用这些术语来思考它会错过它的真正力量,并会导致挫败感.您不能将Core Data与任意数据库架构一起使用(这就是为什么所有Core Data教程都从创建NSManagedObjectModel开始).您不应将Core Data用作持久性框架并使用单独的模型层; 您应该使用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];
Run Code Online (Sandbox Code Playgroud)

(请注意,我假设您正在使用垃圾收集;此代码在手动内存管理环境中泄漏).

要添加实体实例(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];
Run Code Online (Sandbox Code Playgroud)

请注意,您需要实体描述来创建托管对象(为什么教程从模型开始),并且您无法在没有托管对象上下文的情况下创建托管对象.

要更新实体实例:

[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
}
Run Code Online (Sandbox Code Playgroud)

要删除实体实例:

[moc deleteObject:obj];
if(![moc save:&err]) {
  NSLog(@"%@", err); // an erro occurred in saving, perhaps due to optimistic locking failure
}
Run Code Online (Sandbox Code Playgroud)

[1]:对于二进制或XML持久性存储,整个图形存储在存储器


Tho*_*ing 8

我会采取以下方式:

  1. 做一般Apple Cocoa教程: 货币转换器
  2. 接下来,深入研究该教程的Cocoa Bindings版本(如果您转到Core Data,Bindings非常方便且非常重要)
  3. Cocoa Dev Central的"构建核心数据应用程序"教程

进一步阅读:
一如既往:适用于Mac OS X
的基于文档的应用程序架构(ADC)的Cocoa编程
最后:Cocoa与.net的某些方面的比较


Bar*_*ark 5

核心数据确实不是数据访问层(有关更多信息,请参阅我的其他答案).但是如果你想要 Cocoa的数据访问层怎么办?你有什么选择?我是一名专业的Cocoa和Qt开发人员,到目前为止我已经设法避开了Windows或Java企业世界,所以我对这些选项的评估可能与你的完全不符.来自一个企业的生态系统,我希望你会发现这些选项有点可怕.我已经按照我的预期给你订购了最让你最不可怕的东西(大概来自最不可靠的Cocoa-y,因此对我来说大致最不熟悉).找到你的胃停止潜伏的名单上的位置,你找到了解决方案......

  1. 虽然Core Data是一个非常强大的框架,用于管理MVC架构的模型组件的对象图,但您没有义务使用它.你可以编写自己的模型层,但仍然可以在Cocoa MVC世界中玩.这就是我们在Core Data之前做到的.你仍然可以使用可可NSObjectController,NSArrayController以及NSTreeController如果你想.因此,您可以使用数据库供应商的本机C/C++ API来滚动自己的数据访问层.

  2. BaseTen框架是一个商业许可的核心数据类API在PostgreSQL后端的顶部.它实际上更像是一个ORM,而不是像Core Data这样的对象图管理框架,但API类似.我的理解是它可以处理现有(任意)模式或使用Core Data托管对象模型.它们提供了自己的NSArrayController子类,可以用作Cocoa数组控制器的替代品.我从来没有亲自使用过BaseTen,所以我不能说它的效用,但我听说过好东西.据我所知,它只是PostgreSQL.

  3. Python-Objective-C桥,名为PyObjC,非常成熟,自10.5以来随OS X一起提供.使用此桥接器,您可以使用Python编写完整的Cocoa应用程序或编写混合Python/Objective-C应用程序.使用PyObjC,您可以使用任何Python ORM(如SQLAlchemy)来实现模型层.同样,对于一个称职的Python和Cocoa程序员来说,不是没有工作,但也许相对容易.

  4. Apple的企业对象框架是WebObjects的一部分,现在是一个Java ORM,它的血统中有一个Objective-C ORM.我相信,您仍然可以使用WebObjects编写桌面应用程序.我知道很多Cocoa模式都会延续,但这是一个非常不同的野兽.我从来没有写过WebObjects代码,所以我不能给你更多关于这个的建议.

  5. 您可以使用跨平台工具包.Qt可以产生不错的Mac用户界面(虽然见下文).Qt还有一个模型层框架,其中包括对QtSql模块中几个数据库的SQL支持.Qt是不是可可可言.Savy Mac用户不喜欢非原生应用.Qt与OS X上的跨平台一样好,但它并不完美.如果你能保持原生,那就去做吧.

  6. 任何Java Swing/SWT垃圾.再次,这是强大的东西,但它看起来像Mac上的地狱,用户不喜欢它.

  7. OS X上的Mono相对不成熟,我不知道任何.Net ORM在Mono上的状态.不过要看一下这件事.至于UI,Mono-GTK的东西在OS X上看起来很糟糕.有一个名为Qyoto的Q#绑定在Mono上运行.