gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 16:27:03 26 4
gpt4 key购买 nike

我正在尝试对托管对象上下文执行提取请求,并带有一个谓词,该谓词针对存在于抽象类的某些子类中的键路径进行测试。

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

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>

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

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

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

谢谢,

最佳答案

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

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

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

关于sqlite - CoreData 通过抽象托管对象获取请求到具体托管对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1505117/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com