我是热衷于尝试Mac开发的大量.NET开发人员中的一员。目前,我正在试图弄清楚Cocoa的各种元素,并有点停留在核心数据上。
我注意到Web上提供的大多数文档和资源都涉及广泛的端到端教程,从模型、生成类、基于文档的UI等开始。似乎没有足够的关注每一点,或者至少没有足够的示例。
有没有人能给我指出正确的方向,无论是在线材料还是书籍,都能给我提供各种详细的指导?也许我被困在.NET的世界里了,但我仍然在考虑数据访问层,等等。我想知道"CRUD“的基础知识,比如设置持久化存储、创建实体、编辑、保存到存储等。如果我能对不同的部分进行单元测试,那就更好了。
我想我是在尝试进入正确的心态--有没有像我们这样的.NET开发人员知道合适的阅读材料来了解可可编程?
非常感谢,丹尼。
发布于 2009-11-12 03:19:34
首先,正如苹果的文档(以及苹果工程师反复发表的评论)所说,核心数据是一项“先进的”Cocoa技术。摸索核心数据需要许多Cocoa范式和模式的知识。说真的,先学可可吧。然后编写一个(或几个)没有核心数据的项目。然后学习核心数据。我是认真的。
为了平息你的好奇心,我将尝试一下粗糙的答案,尽管它不会是你想要的答案。答案是,核心数据没有CRUD模式,至少不是您认为的那样。原因是Core Data不是数据访问层。它是一个对象图管理框架。这意味着核心数据的明确的预期工作是管理对象实例的图形。此图具有约束(如关系的基数或单个实例属性上的约束)和通过该图进行级联更改(如删除)的规则。核心数据管理这些约束。因为对象图可能太大而无法存储在内存中,所以核心数据为您的对象图提供了一个接口,该接口通过故障(对象实例在第一次进入托管对象上下文时不是“故障”,并且被“触发”以懒惰地从持久性存储中填充其属性)和唯一(在上下文中只创建特定实体实例(在持久性存储中)的一个内存中的实例)来在内存中创建整个对象图( simulates1 )。
核心数据恰好使用磁盘上的持久化存储来实现大型对象图的接口。在SQL持久化存储的情况下,此实现恰好使用SQLite兼容的数据库。然而,这是一个实现细节。例如,您可以创建一个内存中的持久性存储,它不会将任何内容持久存储到磁盘中,但允许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];(请注意,我假设您正在使用垃圾收集;此代码在手动内存管理环境中泄漏)。
要添加实体实例(继续使用上面的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持久存储,整个图存储在内存中
发布于 2009-11-11 17:41:36
我会采取以下路线:
苹果Cocoa开发人员中心一般教程:Currency Converter
进一步阅读:
一如既往:Cocoa Programming for Mac OS X这本书
Document-Based Application Architecture (模数转换器)
最后:一个comparison between some aspects of Cocoa and .net
发布于 2009-11-12 15:05:18
核心数据实际上不是数据访问层(有关更多信息,请参阅我的另一个答案)。但是,如果您想要Cocoa的数据访问层呢?你有什么选择?我是一名专业的Cocoa和Qt开发人员,到目前为止,我已经设法避免了Windows或Java企业世界,所以我对这些选项的评估可能与您的不完全一致。来自企业级生态系统,我希望你会发现这些选项有点可怕。我已经订购了它们,我希望它们对你来说是最可怕的到最不可怕的(大致上是从可可-y到最不熟悉的东西,所以也大致是我最不熟悉的)。在列表中找到你的胃不再颤动的地方,你就找到了解决方案……
虽然核心数据是一个非常强大的框架,用于管理体系结构的模型组件的对象图,但您并不一定要使用它。您可以编写自己的模型层,但仍然可以在Cocoa MVC世界中发挥作用。这就是我们在Core Data之前是如何做到的。如果需要,您仍然可以使用Cocoa NSObjectController、NSArrayController和NSTreeController。因此,您可以使用您的数据库供应商的原生C/C++ API来创建自己的数据访问层。
NSArrayController子类,您可以将其用作Cocoa的数组控制器的替代。我从来没有亲自使用过BaseTen,所以我不能谈论它的效用,但我听说过一些好的东西。据我所知,它只支持PostgreSQL。Python-https://stackoverflow.com/questions/1714054
复制相似问题