8

私の状況は単純です。コアデータストアにいくつかのレコードがあります。それらの属性の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!私は困惑しています。

ありがとう!

4

2 に答える 2

4

localIdが数値の場合、述語形成では。の代わりにオブジェクトを使用する必要がありNSNumberますNSString

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

NSPredicateフォーマット文字列は、NSStringオブジェクトを自動的に引用します。

于 2011-03-23T14:56:54.960 に答える
1

言うのは嫌ですが、これらのタイプの問題の最も一般的な原因は単純なタイプミスです。属性名と述語が同じであることを確認してください。プロパティ名と属性名が同じであることを確認してください。プロパティへの参照は機能するが、属性名への参照が機能しない場合は、おそらく不一致があります。

次の結果を比較することで、後者をテストできます。

[result valueForKey:@"localID"]

...のリターンで:

result.localID
于 2011-03-23T19:42:31.587 に答える