2011-03-23 86 views
8

我的情況很簡單:我的核心數據存儲中有一些記錄。其中一個屬性是一個名爲「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!我很難過。

謝謝!

回答

1

討厭這樣說,但這些類型的問題最常見的原因是簡單的拼寫錯誤。確保您的屬性名稱和謂詞相同。確保您的屬性名稱和屬性名稱相同。如果對某個屬性的引用有效,但對屬性名稱的引用不存在,則可能是不匹配。

[result valueForKey:@"localID"] 

...與迴歸:

你可以通過比較迴歸測試後

result.localID 
+0

感謝您的提示!我會通過並確保我的東西拼寫正確。然而,這個問題發生在幾個屬性上,所以我傾向於認爲它是更基礎的東西。希望我錯了!威爾回報。再次感謝。 – CharlieMezak 2011-03-23 20:02:31

+0

你知道,這不可能是問題,因爲正如我在我的問題中所說的,我可以使用我試圖在提取請求中使用的相同謂詞過濾結果。所以謂詞本身不是問題,至少不是拼寫方面的問題。爲什麼謂詞對於篩選結果數組而不是取數請求有效? – CharlieMezak 2011-03-24 11:47:54

+0

上面的代碼不顯示完全相同的謂詞。此外,如果您定義了NSManagedObject子類,則可以創建與實體屬性名稱不同的屬性名稱。提取將查找實體屬性名稱,而數組上的謂詞將查看類屬性名稱。 – TechZen 2011-03-24 20:29:02

4

如果localId是一個數值,那麼您應該在謂詞形式中使用NSNumber對象而不是NSString

[request setPredicate:[NSPredicate predicateWithFormat:@"localId == %@", 
    [NSNumber numberWithString:localId]]]; 

NSPredicate格式化字符串自動引用NSString對象。

+0

謝謝!這是一個好點,但localId是一個字符串值。所以我不認爲這是問題。我會編輯我的問題來說明問題。 – CharlieMezak 2011-03-23 15:59:54

+1

現在看來,這個問題對於我的所有預測獲取請求都是常見的,包括字符串和數值! AArrg! – CharlieMezak 2011-03-23 16:53:45