我的情況很簡單:我的核心數據存儲中有一些記錄。其中一個屬性是一個名爲「localId」的字符串。有一點我想用特定的localId值查找記錄。做到這一點的顯而易見的方法是使用NSFetchRequest和NSPredicate。但是,當我設置它時,請求返回零記錄。然而,如果我使用沒有謂詞的獲取請求,返回所有記錄,並且只是遍歷它們尋找目標localId值,我確實找到了我正在尋找的記錄。換句話說,記錄在那裏,但取回請求找不到它。NSPredicate返回無取回請求的結果,適用於數組過濾
我使用提取請求和謂詞的其他方法都按預期工作。我不知道爲什麼這個失敗。
我想這樣做:
- (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];
}
但我最終做到這一點:
- (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];
}
任何線索,有什麼可以去錯了嗎?
編輯
我發現我可以使用謂詞我創建得到讀取請求已經被執行後,我所期望的結果。所以,以下也適用:
- (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;
}
}
UPDATE
我遇到別人遇到這個問題很:
http://markmail.org/message/7zbcxlaqcgtttqo4
他一直沒有找到解決的辦法。
Blimey!我很難過。
謝謝!
感謝您的提示!我會通過並確保我的東西拼寫正確。然而,這個問題發生在幾個屬性上,所以我傾向於認爲它是更基礎的東西。希望我錯了!威爾回報。再次感謝。 – CharlieMezak 2011-03-23 20:02:31
你知道,這不可能是問題,因爲正如我在我的問題中所說的,我可以使用我試圖在提取請求中使用的相同謂詞過濾結果。所以謂詞本身不是問題,至少不是拼寫方面的問題。爲什麼謂詞對於篩選結果數組而不是取數請求有效? – CharlieMezak 2011-03-24 11:47:54
上面的代碼不顯示完全相同的謂詞。此外,如果您定義了NSManagedObject子類,則可以創建與實體屬性名稱不同的屬性名稱。提取將查找實體屬性名稱,而數組上的謂詞將查看類屬性名稱。 – TechZen 2011-03-24 20:29:02