首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >可可核心数据新手操作指南

可可核心数据新手操作指南
EN

Stack Overflow用户
提问于 2009-11-11 17:26:11
回答 6查看 3K关注 0票数 10

我是热衷于尝试Mac开发的大量.NET开发人员中的一员。目前,我正在试图弄清楚Cocoa的各种元素,并有点停留在核心数据上。

我注意到Web上提供的大多数文档和资源都涉及广泛的端到端教程,从模型、生成类、基于文档的UI等开始。似乎没有足够的关注每一点,或者至少没有足够的示例。

有没有人能给我指出正确的方向,无论是在线材料还是书籍,都能给我提供各种详细的指导?也许我被困在.NET的世界里了,但我仍然在考虑数据访问层,等等。我想知道"CRUD“的基础知识,比如设置持久化存储、创建实体、编辑、保存到存储等。如果我能对不同的部分进行单元测试,那就更好了。

我想我是在尝试进入正确的心态--有没有像我们这样的.NET开发人员知道合适的阅读材料来了解可可编程?

非常感谢,丹尼。

EN

回答 6

Stack Overflow用户

发布于 2009-11-12 03:19:34

首先,正如苹果的文档(以及苹果工程师反复发表的评论)所说,核心数据是一项“先进的”Cocoa技术。摸索核心数据需要许多Cocoa范式和模式的知识。说真的,先学可可吧。然后编写一个(或几个)没有核心数据的项目。然后学习核心数据。我是认真的。

为了平息你的好奇心,我将尝试一下粗糙的答案,尽管它不会是你想要的答案。答案是,核心数据没有CRUD模式,至少不是您认为的那样。原因是Core Data不是数据访问层。它是一个对象图管理框架。这意味着核心数据的明确的预期工作是管理对象实例的图形。此图具有约束(如关系的基数或单个实例属性上的约束)和通过该图进行级联更改(如删除)的规则。核心数据管理这些约束。因为对象图可能太大而无法存储在内存中,所以核心数据为您的对象图提供了一个接口,该接口通过故障(对象实例在第一次进入托管对象上下文时不是“故障”,并且被“触发”以懒惰地从持久性存储中填充其属性)和唯一(在上下文中只创建特定实体实例(在持久性存储中)的一个内存中的实例)来在内存中创建整个对象图( simulates1 )。

核心数据恰好使用磁盘上的持久化存储来实现大型对象图的接口。在SQL持久化存储的情况下,此实现恰好使用SQLite兼容的数据库。然而,这是一个实现细节。例如,您可以创建一个内存中的持久性存储,它不会将任何内容持久存储到磁盘中,但允许Core Data照常管理您的对象图。因此,核心数据并不是真正的数据访问层。用这些术语来思考它会错过它的真正力量,并会导致沮丧。核心数据不能与任意的数据库模式一起使用(这就是为什么所有核心数据教程都从创建NSManagedObjectModel开始)。您不应该将Core Data用作持久性框架并使用单独的模型层;您应该将Core Data用作模型层,并利用Core Data将模型的对象图持久存储到磁盘的功能。

也就是说,要创建一个NSManagedObjectContext (它提供了我上面描述的对象图接口):

代码语言:javascript
复制
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 ):

代码语言:javascript
复制
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];

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

要更新实体实例,请执行以下操作:

代码语言:javascript
复制
[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
}

要删除实体实例,请执行以下操作:

代码语言:javascript
复制
[moc deleteObject:obj];
if(![moc save:&err]) {
  NSLog(@"%@", err); // an erro occurred in saving, perhaps due to optimistic locking failure
}

1:对于二进制或XML持久存储,整个图存储在内存中

票数 15
EN

Stack Overflow用户

发布于 2009-11-11 17:41:36

我会采取以下路线:

苹果Cocoa开发人员中心一般教程:Currency Converter

  • Next,深入该教程的Cocoa Bindings version (如果您继续讨论核心数据,绑定将非常方便且非常重要)

  • Cocoa Dev

  • "Build a Core Data App" tutorial

进一步阅读:

一如既往:Cocoa Programming for Mac OS X这本书

Document-Based Application Architecture (模数转换器)

最后:一个comparison between some aspects of Cocoa and .net

票数 8
EN

Stack Overflow用户

发布于 2009-11-12 15:05:18

核心数据实际上不是数据访问层(有关更多信息,请参阅我的另一个答案)。但是,如果您想要Cocoa的数据访问层呢?你有什么选择?我是一名专业的Cocoa和Qt开发人员,到目前为止,我已经设法避免了Windows或Java企业世界,所以我对这些选项的评估可能与您的不完全一致。来自企业级生态系统,我希望你会发现这些选项有点可怕。我已经订购了它们,我希望它们对你来说是最可怕的到最不可怕的(大致上是从可可-y到最不熟悉的东西,所以也大致是我最不熟悉的)。在列表中找到你的胃不再颤动的地方,你就找到了解决方案……

虽然核心数据是一个非常强大的框架,用于管理体系结构的模型组件的对象图,但您并不一定要使用它。您可以编写自己的模型层,但仍然可以在Cocoa MVC世界中发挥作用。这就是我们在Core Data之前是如何做到的。如果需要,您仍然可以使用Cocoa NSObjectControllerNSArrayControllerNSTreeController。因此,您可以使用您的数据库供应商的原生C/C++ API来创建自己的数据访问层。

  1. BaseTen框架是在PostgreSQL后端之上的一个商业许可的类似核心数据的应用程序接口。它实际上更像是一个ORM,而不是像Core Data这样的对象图管理框架,但API是相似的。我的理解是,它可以处理现有的(任意)模式或利用核心数据管理对象模型。它们提供了自己的NSArrayController子类,您可以将其用作Cocoa的数组控制器的替代。我从来没有亲自使用过BaseTen,所以我不能谈论它的效用,但我听说过一些好的东西。据我所知,它只支持PostgreSQL。Python-
  2. -Objective-C桥,称为PyObjC,已经相当成熟了,从10.5开始就随OS一起发布了。使用此桥,您可以用Python编写完整的Cocoa应用程序,或者编写Python/Objective-C混合应用程序。使用PyObjC,您可以利用任何Python ORM,例如SQLAlchemy来实现您的模型层。同样,对于一个称职的Python和Cocoa企业对象框架( WebObjects的一部分)来说,不是没有工作,但可能仍然相对容易,它现在是一个Java ORM,它的谱系中有一个Objective-Cocoa。我相信,你仍然可以使用WebObjects编写桌面应用程序。我知道许多Cocoa模式都会延续下去,但这是一个非常不同的模式。我从来没有写过WebObjects代码,所以在这方面我不能给你更多的建议。
  3. 你可以使用跨平台的工具包。Qt可以生成外观不错的Mac (尽管见下文)。Qt还有一个模型层框架,它在QtSql模块中包含对several数据库的SQL支持。Qt根本不是Cocoa。Savy Mac用户不喜欢非原生应用程序。Qt对于OS上的跨平台来说已经是最好的了,但它并不完美。如果你能保持原生,那就去做吧。
  4. 任何Java Swing/SWT的垃圾。同样,这是一个强大的东西,但在苹果电脑上看起来就像地狱一样,用户不喜欢它。OS X上的
  5. Mono相对不成熟,我不知道Mono上的任何.Net ORM的状态。不过,这是值得一看的东西。至于UI,Mono-GTK在OS上看起来相当糟糕。Qt有一个叫做Qyoto的C#绑定,它在Mono上运行。
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1714054

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档