0

10の異なるエンティティを管理するCoreDataアプリがあります。それらは基本的にすべて同じであり、同じ属性を持っています。(NSStringsとUIImage)これにより、10個のテーブルを含む1つのsqliteDBが作成されます。

Collection A table
-item with attributes xyz
-item with attributes xyz
-item with attributes xyz
Collection B table
-item with attributes xyz
-item with attributes xyz
-item with attributes xyz
etc, etc

私は今、これがそれを行うのに悪い方法であったことに気づきました。最終的には、10種類のViewControllerと10種類のFRCになります。「collectionX」属性を持つ1つのテーブルにすべてを含める必要がありました。このようにして、すべてのコレクションアイテムを1つのテーブルにまとめ、ユーザーがどのコレクションにいるかに応じて、「collectionX」属性を使用して述語を使用してFRCからそれらのアイテムを返すことができます。

私がやりたいのは、すべてを1つのテーブルに移行し、コレクション名の属性を追加することです。

Collection table
-item from collection A (w/new "collectionX" attribute filled in as "collectionA")
-item from collection A (w/new "collectionX" attribute filled in as "collectionA")
-item from collection A (w/new "collectionX" attribute filled in as "collectionA")
-item from collection B (w/new "collectionX" attribute filled in as "collectionB")
-item from collection B (w/new "collectionX" attribute filled in as "collectionB")
-item from collection B (w/new "collectionX" attribute filled in as "collectionB")
etc, etc

したがって、軽量の移行では、10個のエンティティすべてにアクセスして、新しい「collectionX」属性を追加し、関連するコレクションの文字列を入力できるはずです。

ここで難しい部分です...各テーブルのすべてのエントリを取得し、それらをすべて新しいものにコピーして、古い10個のテーブルを削除するにはどうすればよいですか?

4

1 に答える 1

2

N 個のデータベースから単一のデータベースに移行する場合、最初のステップを実行するかどうかさえわかりません。

代わりに、アプリケーションの起動時に、「新しい」データベースを探します。そこにない場合は、他のデータベースを探して、バックグラウンド アップデートを開始します。

そのバックグラウンド スレッドで、新しいデータベースの完全なコア データ スタックを作成してから、各古いデータベースをループします。スレッドの使用を容易にするために、スレッドの制限を使用してすべての MOC を作成します。

「古い」データベースごとに、すべてのオブジェクトを照会し、各オブジェクトをループして、その値を新しいデータベースに新しく挿入されたオブジェクトに割り当てます。

すべてのエンティティが同じ名前であれば、簡単です。そうでない場合は、NSEntityDescription からプロパティ名を取得して、プロパティをループします。KVC を使用して (つまり、新しいオブジェクトに適切な値valueForKey:setValue:forKey:簡単に設定できるようにします。次に、適切なカテゴリを割り当てます。

すべてのオブジェクトのループが完了すると、「新しい」データベースに重複したデータベースができたので、古いデータベースを削除できます。「新しい」データベースを閉じてから、通常の初期化フェーズを経て、によって使用されるデータベースを作成します

大量のデータがあり、移行中にアプリを機能させたい場合は、バックグラウンドで更新を実行しながら、アプリを古いデータ ファイルで実行することもできます。更新が完了したら、スワップできます。

編集

「各古いデータベースをループする」とはどういう意味ですか? そのすべてのデータを効果的に「カット アンド ペースト」するにはどうすればよいでしょうか。– RyeMAC3

まさにそれ。10 個のデータベースのそれぞれをループします。何かのようなもの:

for (NSString *dbName in databaseNames) {
    // Create a Core Data stack for the old database
    NSManagedObjectContext *oldDatabaseMOC = ...
    // Now, fetch objects from that database and insert new ones into the new database
}
于 2012-09-17T14:23:44.383 に答える