核心数据获取请求崩溃而没有错误日志

时间:2014-02-15 19:42:38

标签: ios cocoa-touch core-data

联系人实体与用户有多对一关系,具有用户ID字段

联系人有一个状态字符串属性,可以是“已批准”,“已拒绝”,“待处理”等

最喜欢的布尔属性

+ (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];
}

堆栈跟踪:

enter image description here

没有注销错误(我已经启用了nszombie)

1 个答案:

答案 0 :(得分:2)

@"(status = 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