CoreData 通过抽象托管对象获取请求到具体托管对象

Posted

技术标签:

【中文标题】CoreData 通过抽象托管对象获取请求到具体托管对象【英文标题】:CoreData fetch request through abstract managed object to concrete managed object 【发布时间】:2009-10-01 16:45:58 【问题描述】:

我正在尝试对托管对象上下文执行获取请求,该请求使用一个谓词来测试抽象类的某些子类中存在的键路径。

例如这里是对象模型的一部分

Library::NSManagedObject
 - AllMovies::to-many relationship->Movie

Movie::NSManagedObject (abstract)
 - type::String
 - name::String
 - mylibrary::to-one relationship->Library

HorrorMovie::Movie
 - monster::String
 - ghosts::BOOL

RomanceMovie::Movie
 - percociouskid::String
 - hasferret::BOOL

如果我设置了以下获取请求

NSEntityDescription *entityDescription = [NSEntityDescription entityForName:@"Library" 
                                                     inManagedObjectContext:moc];
NSFetchRequest *request = [[[NSFetchRequest alloc] init] autorelease];
[request setEntity:entityDescription];
NSPredicate *predicate = [NSPredicate predicateWithFormat:
                            @"(SUBQUERY(AllMovies, $movies, 
                                                   $movies.type like[c] 'horror' and
                                                   $movies.moster like[c] 'yeti'
                                       ).@count != 0)"
                          ] 
[request setPredicate:predicate];

NSArray *array = [moc executeFetchRequest:request error:&error];

执行获取请求会返回类似的错误

keypath $movies.monster not found in entity <NSSQLEntity Movie id=2>

似乎没有办法对谓词进行惰性求值。我已经尝试过的其他一些事情是使用 CAST 关键字的 ANY 谓词,尝试用另一个 SUBQUERY 替换 SUBQUERY 中的“AllMovies”,以返回一组与“type”值匹配的对象。

可以为每个符合条件的类型执行多个请求,但这很粗鲁、缓慢且笨拙。

这是在带有 SQL 持久存储的 OS X 10.6 下。做一个内存存储不是一个选项,因为我正在使用 100 万多个“图书馆”(该项目与电影没有任何关系,但我认为这是一个很好的例子)。

谢谢, 抢

【问题讨论】:

【参考方案1】:

这是行不通的,因为您的实体模型只是告诉 Core Data AllMovies 关系包含 Movie 对象。因此,Core Data 期望能够仅发送Movie 对象能够理解的那些消息。当它发起 fetch 时,它会针对每个 Movie 对象(由 fetch 实体指定)测试谓词。

然而,Movie 实体和RomanceMovie 实体都不能理解monster 消息(因为它们缺少该属性。)谓词测试被渲染为无意义的。这就是你得到错误的原因。

您需要重新考虑您的设计。使用实体继承可能不是您想要的方式。

【讨论】:

以上是关于CoreData 通过抽象托管对象获取请求到具体托管对象的主要内容,如果未能解决你的问题,请参考以下文章

Core Data - 通过 URI 获取托管对象

CoreData 获取请求在更改应用程序状态时返回具有 nil 属性的对象

有没有比获取请求更快的方法来检索 Core Data 中的特定托管对象?

通过UserNotification自定义操作访问时,CoreData无法初始化托管对象

如何从 RestKit 托管对象存储中删除对象

在 Core Data 中执行子获取时,在父上下文中修改托管对象是不是会向下传播到子上下文?