我在Core Data中有这样的关系:
A -> B
和以下表格:
A
----
id
path
ref_foreignkey_B
B
----
id
name
问题是外键设置为B
对象(继承自NSObject)。
然后我试图从A中获取所有条目,其中设置了对某个B对象的引用。我知道对象B,但无法弄清楚如何正确设置NSPredicate
。
我尝试了以下内容:
NSString *complexPredicateFormat = [NSString stringWithFormat:@"ZREF_B == %@", self.B];
NSPredicate *filter = [NSPredicate predicateWithFormat:complexPredicateFormat];
[fetchRequest setPredicate:filter];
...但是会导致以下错误:
'NSInvalidArgumentException', reason: 'Unable to parse the format string "ZREF_B == <B: 0x89d8300> (entity: B; id: 0x89d3ca0 <x-coredata://...
有谁知道如何将NSManagedObject
(更新的)设置为预测过滤器(代表where子句)?
修改: 对不起。当然A和B都继承自NSManagedObject和NOT NSObject。
答案 0 :(得分:0)
不确定我是否理解这个问题,但如果“ref_foreignkey_B”是从A到B的关系,那么你的谓词应如下所示:
NSFetchRequest *fetch = [NSFetchRequest alloc] init];
fetch.entity = [NSEntityDescription entityForName:@"A" inManagedObjectContext:managedObjectContext];
NSPredicate *filter = [NSPredicate predicateWithFormat:@"ref_foreignkey_B == %@", self.B];
NSError *error = nil
NSArray *array = [managedObjectContext executeRequest:fetch];
...
答案 1 :(得分:0)
基于 Gabriel 建议:
您是否创建了数据模型?为什么你的实体是NSObject
的子类?
然后
如果ref_foreignkey_B
是实体B
的关系,则需要使用
[NSPredicate predicateWithFormat:@"ref_foreignkey_B == %@", self.B];
显然,如果您使用该谓词,则需要针对A
而不是B
进行查询(使用获取请求)。
NSFetchRequest* fetchRequest = [NSFetchRequest fetchRequestWithEntityName:@"A"];
[fetchRequest setPredicate:[NSPredicate predicateWithFormat:@"ref_foreignkey_B == %@", self.B];
一些笔记
为什么使用ZREF_B
?这是在sqlite文件中创建的列(我想)。您不必使用它,只需使用数据模型中声明的属性(属性或关系)。
id,path和ref_foreignkey_B for A
B
的ID和名称
当您处理Core Data时,您处理的是对象图,而不是db(例如sqlite)本身。这是一个需要理解的重点。您有不来处理为您创建的sqlite文件(例如)。仅限您创建的数据模型。
此外,我建议您创建从B
到A
的反向关系。这使您可以在对象图中保持完整性。有关信息,请阅读Relationships。
希望它有所帮助。