联系人实体与用户有多对一的关系,其中有一个userID字段
联系人有一个状态字符串属性,可以是'approved'、'rejected'、'pending'等
最喜欢的 bool 属性
+ (NSSet *)fetchContactsWithUserID:(NSString *)userID approvedOnly:(BOOL)approvedOnly favoriateOnly:(BOOL)favoriateOnly {
NSString *predString = [NSString stringWithFormat:@"(user.userID = %@)", userID];
if (approvedOnly) {
predString = [predString stringByAppendingString:@" AND (status = approved)"];
}
if (favoriateOnly) {
predString = [predString stringByAppendingString:@" AND (favorite = YES)"];
}
NSPredicate *pred = [NSPredicate predicateWithFormat:predString];
return [self private_fetchEntitiesWithName:@"Contact" predicate:pred];
}
+ (NSSet *)private_fetchEntitiesWithName:(NSString *)name predicate:(NSPredicate *)predicate {
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:name inManagedObjectContext:[self private_context]];
[fetchRequest setEntity:entity];
if (predicate) {
[fetchRequest setPredicate:predicate];
}
NSError *error;
NSArray *fetchedObjects = [[self private_context] executeFetchRequest:fetchRequest error:&error]; //CRASH ON THIS LINE!!!!!!
return [NSSet setWithArray:fetchedObjects];
}
堆栈跟踪:
注销没有错误(我已经启用了nszombie)
最佳答案
@"(status = approved)"
不是有效谓词。如果 approved 是一个字符串,您的谓词字符串应该是 @"AND (status =\"approved\")"
或 @"AND (status = 'approved')"
。
如果直接在谓词中使用字符串文字,则必须将其括在引号中。
NSFetchRequest 将未包含在引号中的字符串视为键。
这样做是因为您实际上可以通过使用比较这两个属性的谓词来检查这两个属性是否相等,例如 @"attribute1 = attribute2"
。
如果您使用包含 %@
的谓词格式,如果您要用作参数的对象是 NSString,NSPredicate 将自动添加引号。
NSPredicate *p1 = [NSPredicate predicateWithFormat:@"foo = %@", @"Bar"];
NSPredicate *p2 = [NSPredicate predicateWithFormat:@"foo = Bar"];
NSLog(@"%@", p1);
NSLog(@"%@", p2);
产量:
xxx[4673:70b] foo == "Bar"
xxx[4673:70b] foo == Bar
关于ios - 没有错误日志的核心数据获取请求崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21802670/