NSPredicate检查核心数据关系中前5个对象的属性

时间:2018-09-26 22:35:28

标签: ios objective-c core-data nspredicate

我正在寻找一个可以检查TypeID关系中前5个对象的Core Data的谓词。

这是我正在尝试的方法,但是不起作用:

int num = 5;
NSMutableArray *predicates = [[NSMutableArray alloc] init];
for (int i = 0; i < num; i++) {

    [predicates addObject:[NSPredicate predicateWithFormat:@"SELF IN %@ AND logs[%i].TypeID == 3", items, i]];

}

出现错误:

  

错误:SQLCore dispatchRequest:异常处理请求:   ,不支持的功能   表达式logs [0] .TypeID,userInfo为(空)CoreData:   错误:SQLCore dispatchRequest:异常处理请求:   ,不支持的功能   表达式日志[0] .UserID为(null)的TypeID

我意识到自己可能做错了,所以可以使用NSPredicate来做到这一点吗?

2 个答案:

答案 0 :(得分:0)

如果只想获取5。将fetchLimit设置为5。以下代码可能无法立即运行,但是原理是相同的。您可以添加属性或get函数来分配“ logs.TypeID”,例如-(Int)myID {return logs [0] .TypeID;},然后使用“ SELF IN%@ AND myID == 3”将解决该问题。

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Entity name" inManagedObjectContext:context];
[fetchRequest setEntity:entity];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF IN %@ AND logs.TypeID == 3", items];
[fetchRequest setPredicate:predicate];
fetchRequest.fetchLimit = 5;
NSError *error = nil;
NSArray *fetchedObjects = [context executeFetchRequest:fetchRequest error:&error];
if (fetchedObjects == nil) {

}

答案 1 :(得分:0)

我不确定我是否理解这些问题,但我认为不可能做到您所要求的,至少不能做到措辞不一。似乎不可能检查关系中的五个对象并停在那里,即使数据库中有更多匹配项,也不会返回任何数目的匹配项,甚至根本不会返回任何匹配项。

但是,我认为这可能是您正在遇到的问题,有可能找到五个既在items集中又至少有一个{{1 }}和log。可以完成与E.Coms所建议的类似的操作,只是需要一个子查询来处理这种关系。 (我假设日志是一对多关系,或者一对多或多对多。)

请注意,以下代码尚未经过测试:

typeID == 3