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

标签 ios cocoa-touch core-data

联系人实体与用户有多对一的关系,其中有一个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];
}

堆栈跟踪:

enter image description here

注销没有错误(我已经启用了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/

相关文章:

iphone - 如何以编程方式确定 iPhone 界面方向?

iphone - 我的图像和缩略图应该使用 png 还是 jpg?

ios - Watchkit 应用程序的退出由 Watchkit 操作系统本身处理,我不需要清除或重置屏幕?

ios - 需要为每个 UICollectionViewCell 分配一个背景颜色,即使在滚动时颜色也必须保持特定顺序

iphone - 如何从 UITextView 获取选定的文本框

ios - 如何在三天后触发 uilocalnotification?

iphone - 核心数据模型更改应用程序更新

swift - 如何将一个电话号码添加到多个实体

c# - 如何避免在较新的应用程序版本中覆盖数据文件

ios - '两阶段旋转动画已弃用。 …' 警告,但是 TabBar Controller *is* root view controller