0

在我的委托中,我指定了以下方法来检索 NSManagedObjects 的 NSSet:

- (NSSet *) entitiesForName : (NSString *)entityName matchingAttributes : (NSDictionary *)attributes {
NSEntityDescription *entity = [NSEntityDescription entityForName:entityName inManagedObjectContext: [NSThread isMainThread] ? managedObjectContext : bgManagedObjectContext];

NSFetchRequest *fetch = [[NSFetchRequest alloc] init];
[fetch setEntity: entity];

NSMutableArray *subPredicates = [[NSMutableArray alloc] init];
[attributes enumerateKeysAndObjectsUsingBlock:^(id key, id value, BOOL *stop) {
    if ([value class] == [NSString class]) {
        NSString *sValue = (NSString *)value;
        [subPredicates addObject:[NSPredicate predicateWithFormat:@"%@ == '%@'", key, [sValue stringByReplacingOccurrencesOfString:@"'" withString:@"\\'"]]];
    } else {
        [subPredicates addObject:[NSPredicate predicateWithFormat:@"%@ == %@", key, value]];
    }
}];
NSPredicate *matchAttributes = [NSCompoundPredicate andPredicateWithSubpredicates:subPredicates];
NSLog(@"matchPredicate: %@", [matchAttributes description]);
[fetch setPredicate: matchAttributes];

NSError *error;
NSSet *entities = [NSSet setWithArray: [managedObjectContext executeFetchRequest:fetch error:&error]];

if (error != nil) {
    NSLog(@"Failed to get %@ objects: %@", entityName, [error localizedDescription]);
    return nil;
}

return [entities count] > 0 ? entities : nil;
}

然后,我使用我知道存在的实体并匹配我知道具有某些相同值的属性来启动此方法(我检查了 sqlite 文件):

[self entitiesForName:@"Lecture" matchingAttributes:[NSDictionary dictionaryWithObject:[NSNumber numberWithBool:NO] forKey:@"attending"]]

控制台输出以下内容(显示谓词):

2013-09-11 22:47:20.098 CoreDataApp[1442:907] matchPredicate: "attending" == 0

关于 NSObject 实体的信息:
- 属性“attending”是一个 BOOL(在类中翻译为 NSNumber)
- 此表中有许多记录(Lecture 实体),一半的“attending”值为 0,另一半为 1
- 使用方法 -上面的entitiesForName,它返回一个空集

其他信息:
我定义了另一种方法来检索相同的方式,但没有谓词(检索所有托管对象),这可以从同一个表中进行。我使用了这个,并且分析从中检索到的记录也证明了一些有“参加” 0 和一些 1

问题:
我的 -entitiesForName 方法是否有问题会导致集合返回为空?

4

1 回答 1

4

您不应该使用%@密钥 - 您需要使用%K密钥路径。

例如

[NSPredicate predicateWithFormat:@"%K == %@", key, value]

您可以在谓词编程指南中找到更多信息

在您当前的情况下,密钥被视为字符串

于 2013-09-11T22:18:24.110 回答