私の状況は単純です。コアデータストアにいくつかのレコードがあります。それらの属性の1つは、「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];
}
しかし、私はこれをしなければならないことになります:
- (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;
}
}
アップデート
私はこの問題を経験している他の誰かに出くわしました:
http://markmail.org/message/7zbcxlaqcgtttqo4
彼も解決策を見つけていません。
Blimey!私は困惑しています。
ありがとう!