web-dev-qa-db-ja.com

コアデータを使用して挿入/更新を実行する方法

Core Dataを使用したレコードの挿入と削除の基本を理解しています。ただし、最も一般的な関数の1つであるinsert/updateのヘルプをいただければ幸いです。

基本的に、私はNSMutableArrayarrayWithContentsOfURLを使用して、mysqlテーブルから行を含む配列を取得します。次に、CoreDataストアを同期します。

つまり、配列のすべての行をCoreDataテーブルに追加する必要がありますが、既に存在する場合は、最新の値でレコードを更新する必要があります。また、ダウンロードした配列ではなくCore Dataに存在する場合は、削除する必要があります。

私はおそらくこれを一緒にハックすることができます。ただし、メモリリークなしで適切かつ効率的に実行される方法を確認したいと思います。

26
slevytam

Core Dataにデータを挿入する方法は2つあり、どちらを使用するかはあなた次第です。ただし、そのうちの1つは、Core Data dbのデータモデルのModelクラスを生成したかどうかによって異なります。

通常は、次の方法を使用します。

NSManagedObject *object = [NSEntityDescription insertNewObjectForEntityForName:@"table" 
inManagedObjectContext:context];
[object setValue:@"value1" forKey:@"stringColumn"];
[object setValue:12 forKey:@"numberValue"];
NSError *error;
if (![context save:&error]) {
    NSLog(@"Failed to save - error: %@", [error localizedDescription]);
}

これは、管理対象オブジェクトのコンテキストがすでに設定されていることを前提としています。オブジェクトを作成してループ内のコンテキストに挿入し、ループの終了後に保存すると、はるかに効率的です。

もう1つの方法はそれほど大きな違いはありませんが、タイプセーフの点でははるかに安全です。 (xcdatamodelsから実行できる)モデルクラスを生成した場合は、そのクラスのオブジェクトを作成し、そのプロパティを設定するだけです。

TableObject *object = [NSEntityDescription insertNewObjectForEntityForName:@"table" 
inManagedObjectContext:context];
[object setStringColumn:@"value1"];
[object setNumberValue:12];
NSError *error;
if (![context save:&error]) {
    NSLog(@"Failed to save - error: %@", [error localizedDescription]);
}

テーブルから削除するには、テーブルからオブジェクトを取得し(ここでは、挿入に2番目のメソッドを使用しているため、モデルクラスが生成されていると想定しています)、次を使用します。

[context deleteObject:object];

これを有効にするには、saveを呼び出す必要があることに注意してください。

お役に立てれば!幸運を!

編集:申し訳ありませんが、私は質問を読み違えたに違いありません!

既存のレコードを調べるには、フェッチ要求を作成し、それを管理オブジェクトコンテキストで実行します。最低でも、フェッチ要求にはエンティティが必要です(そのため、検索するテーブルを認識しています)。検索語を指定するには、述語を作成する必要があります(そうでない場合、要求はテーブル内のすべてを返すだけです)。結果がソートされるように、ソート記述子のセットを指定することもできます。

NSFetchRequest *request = [[[NSFetchRequest alloc] init] autorelease];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"table" inManagedObjectContext:context];
[request setEntity:entity];

NSError *errorFetch = nil;
NSArray *array = [context executeFetchRequest:request error:&errorFetch];

このコードはフェッチ要求を作成し、「table」という名前のテーブルからすべてのオブジェクトを配列で返します。ここから、必要なすべてのオブジェクトが配列にあるため、レコードを検査および編集できます。変更を行った場合は、必ずコンテキストを保存してください。次のループは、上記の例と同じテーブルを使用して、各オブジェクトの最初の値を記録します。

for(TableObject *object in array)
{
    NSLog(@"object value1 = %@", object.value1);
}

上記の関数を使用して、この時点からレコードを削除することもできます。

フェッチリクエストの詳細については、 クラス参照 をご覧ください。また、並べ替え記述子と述語は、Core Data dbを検索するために非常に重要であり、それらの特定の使用法は他のものよりも効率が悪いため(特にNSPredicateの作成において)、強くお勧めします。

幸運を!

37
Andrew Natoli