我正在尝试使用谓词针对托管对象上下文执行获取请求,该谓词针对抽象类的某些子类中存在的键路径进行测试。
例如这里是对象模型的一部分
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];
执行 fetch 请求会返回一个错误,例如
keypath $movies.monster not found in entity <NSSQLEntity Movie id=2>
似乎没有办法对谓词进行惰性求值。我已经尝试过的其他一些事情是使用 CAST 关键字的 ANY 谓词,尝试用另一个 SUBQUERY 替换 SUBQUERY 中的“AllMovies”,以返回一组与“type”值匹配的对象。
可以为每个合格类型执行多个请求,但这是粗略、缓慢和笨拙的。
这是在带有 SQL 持久存储的 OS X 10.6 下。做一个内存存储不是一个选项,因为我正在使用 100 万多个“图书馆”(该项目与电影没有任何关系,但我认为这是一个很好的例子)。
谢谢,罗伯