NSPredicate使用获取请求返回无结果,适用于阵列过滤

Cha*_*zak 8 core-data nspredicate nsfetchrequest ios

我的情况很简单:我的核心数据存储中有一些记录.它们的一个属性是名为"localId"的字符串.有一点,我想找到具有特定localId值的记录.显而易见的方法是使用NSFetchRequest和NSPredicate.但是,当我设置它时,请求返回零记录.

但是,如果我使用不带谓词的获取请求,返回所有记录,只是遍历它们寻找目标localId值,我确实找到了我正在寻找的记录.换句话说,记录在那里,但是获取请求找不到它.

我使用获取请求和谓词的其他方法都按预期工作.我不知道为什么这个失败了.

我想做这个:

- (void)deleteResultWithLocalID:(NSString *)localId {
    NSFetchRequest *request = [[NSFetchRequest alloc] init];
    [request setEntity:[NSEntityDescription entityForName:@"WCAAssessmentResult" inManagedObjectContext:context]];
    [request setPredicate:[NSPredicate predicateWithFormat:@"localId == %@", localId]];
    NSError *error = nil;
    NSArray *results = [context executeFetchRequest:request error:&error];
    NSAssert(error == nil, ([NSString stringWithFormat:@"Error: %@", error]));
    if ([results count]) [context deleteObject:[results objectAtIndex:0]];
    else NSLog(@"could not find record with localID %@", localId);
    [self saveContext];
}
Run Code Online (Sandbox Code Playgroud)

但我最终不得不这样做:

- (void)deleteResultWithLocalID:(NSString *)localId {
    NSFetchRequest *request = [[NSFetchRequest alloc] init];
    [request setEntity:[NSEntityDescription entityForName:@"WCAAssessmentResult" inManagedObjectContext:context]];
    NSError *error = nil;
    NSArray *results = [context executeFetchRequest:request error:&error];
    NSAssert(error == nil, ([NSString stringWithFormat:@"Error: %@", error]));
    for (WCAAssessmentResult *result in results) {
        if ([result.localId isEqualToString:localId]) {
            NSLog(@"result found, deleted");
            [context deleteObject:result];
        }
    }
    [self saveContext];
}
Run Code Online (Sandbox Code Playgroud)

什么可能出错的线索?

编辑

我发现我可以使用我正在创建的谓词来获取我在执行获取请求后所期望的结果.所以,以下也有效:

- (WCAChecklistItem *)checklistItemWithId:(NSNumber *)itemId {
     NSFetchRequest *request = [[NSFetchRequest alloc] init];
     [request setEntity:[NSEntityDescription entityForName:@"WCAChecklistItem" inManagedObjectContext:context]];
     NSArray *foundRecords = [context executeFetchRequest:request error:nil];
     foundRecords = [foundRecords filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"serverId == %@", itemId]];
     if ([foundRecords count]) {
         return [foundRecords objectAtIndex:0];
     } else {
         NSLog(@"can't find checklist item with id %@", itemId);
         return nil;
    }
}
Run Code Online (Sandbox Code Playgroud)

UPDATE

我遇到过遇到这个问题的其他人:

http://markmail.org/message/7zbcxlaqcgtttqo4

他也没有找到解决方案.

啊呀!我很难过.

谢谢!

Tec*_*Zen 1

不想这么说,但此类问题的最常见原因是简单的拼写错误。确保您的属性名称和谓词相同。确保您的属性名称和属性名称相同。如果对属性的引用有效,但对属性名称的引用无效,则可能存在不匹配。

您可以通过比较以下内容的返回来测试后者:

[result valueForKey:@"localID"]
Run Code Online (Sandbox Code Playgroud)

...返回:

result.localID
Run Code Online (Sandbox Code Playgroud)