3

sqllite テーブルにまだ存在しないレコードのみを iPhone のコア データに挿入したいと考えています。つまり、コア データ テーブルに個別のレコードを挿入したいと考えています。私の挿入コードは

for(NSInteger j=0;j<[items count];j++){
            Story *story=(Story *)[NSEntityDescription insertNewObjectForEntityForName:@"Story" inManagedObjectContext:managedObjectContext];

            [story setTitle:[[items objectAtIndex:j] objectForKey:@"title"]];
            [story setDate:[[items objectAtIndex:j] objectForKey:@"date"]];
     }

これに異なるレコードだけを挿入する方法を教えてください。

4

2 に答える 2

5

このページをご覧ください。「効率的に検索または作成を実装する」セクションに、更新/挿入メカニズムを実装する方法に関する詳細情報が記載されています。

于 2011-09-15T09:43:35.370 に答える
3

1つの解決策は、エンティティにindex属性(整数値のみ)を指定し、新しいエンティティを追加する前にこれを確認することです。

または、重複を可能にしたくない場合は、同じtitleと。を使用してストーリーに対してフェッチを実行するだけdateです。このフェッチから何も返されない場合は、独自のコードのように新しいオブジェクトを追加します。次のように実装できます。

NSString *title = [[items objectAtIndex:i] objectForKey:@"title"];
NSDate *date = [[items objectAtIndex:i] objectForKey:@"date"];

NSEntityDescription *entity = [NSEntityDescription entityForName:@"Story" inManagedObjectContext:managedObjectContext];

// Create the predicates to check for that title & date.
NSString *predTitleString = [NSString stringWithFormat:@"%@ == %%@", @"title"];
NSString *predDateString = [NSString stringWithFormat:@"%@ == %%@", @"date"];

NSPredicate *predTitle = [NSPredicate predicateWithFormat:predTitleString, @"title"];
NSPredicate *predDate = [NSPredicate predicateWithFormat:predDateString, @date];

NSArray *predArray = [NSArray arrayWithObjects:predTitle, predDate, nil];
NSPredicate *predicate = [NSCompoundPredicate andPredicateWithSubpredicates:predArray];

// Create the fetch request.
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
[fetchRequest setEntity:entity];
[fetchRequest setPredicate:predicate];

// Fetch results.
NSError *error = nil;
NSArray *array = [context executeFetchRequest:fetchRequest error:&error];

// If no objects returned, a story with this title & date does not yet exist in the model, so add it.
if ([array count] == 0) {
    Story *story=(Story *)[NSEntityDescription insertNewObjectForEntityForName:@"Story" inManagedObjectContext:managedObjectContext];

    [story setTitle:title];
    [story setDate:date];
}

[fetchRequest release];

これらのフェッチを実行するためのジェネリックメソッドを含むユーティリティクラスを実装すると非常に便利であることがわかったので、エンティティの名前、チェックするキーと値のディクショナリ、および検索するコンテキストを指定するだけです。 in。多くのコードを書き直す手間が省けます!

お役に立てれば。

于 2011-09-15T09:57:37.360 に答える