5

私のアプリはコア データ SQLite データベースを使用しています。ユーザーが iCloud を使用してデバイス間で同期できるようにしたいと考えています。UIManagedDocument を使用できると考えていました。

Apple のドキュメントに従ってサブクラス化しました。これは、新しい永続ストア ファイルを作成する必要がある場合に機能します。ただし、それを使用して古い永続ストア ファイルを開こうとすると、次の例外がスローされます。

「UIManagedDocument は、ファイル パッケージであるドキュメントのみを読み取ることができます」

これは、古い永続ストアを UIManagedDocument によって管理される新しいストアに移行する必要があるということですか? その場合、これを手動で行う必要がありますか (つまり、古いストアから一度に 1 つずつレコードを読み取り、新しいストアに書き込みます)。

前もって感謝します!

4

2 に答える 2

5

UIManagedDocumentは、アトミックストアではなくパッケージ(フォルダー)を作成します。店はまだそこにありますが、パッケージに埋もれています。シミュレーターのDocumentsフォルダーに作成されたファイルを右クリックすると、構造を確認できます。デフォルトは

mydocument.foo
   -> StoreContent
      -> persistentStore

あなたがする必要があるのはあなたのアプリファイルタイプのための新しい拡張子を作成することです、それで例えばあなたのデータベース拡張子が .myappdbあなたであるならばあなたはあなたのプロジェクト設定で新しいドキュメントタイプを作成する必要があります.myappdbw。のエントリからすべての設定をコピーできます.myappdb

mydocumenturl次に、永続ストアコーディネーターに渡す代わりに、でレガシードキュメントを開く処理を行う時点で、上記のディレクトリ構造を作成します。

NSURL *newurl = [[mydocumenturl  URLByDeletingPathExtension] URLByAppendingPathExtension:@"myappdbw"];
NSURL *desturl = [newurl URLByAppendingPathComponent:@"StoreContent"];
[[NSFileManager defaultManager] createDirectoryAtURL:desturl withIntermediateDirectories:YES attributes:nil error:NULL];
NSURL *finalurl = [desturl URLByAppendingPathComponent:@"persistentStore"];

次に、レガシーデータベースを作成したフォルダシステムに移動します

[[NSFileManager defaultManager] moveItemAtURL:mydocumenturl toURL:finalurl error:NULL];

次に、バンドルURLをUIManagedDocumentに渡すことができます

UIManagedDocument *doc = [[UIManagedDocument alloc] initWithFileURL:newurl];

iCloud統合に役立つリンクは次のとおりです。

http://developer.apple.com/library/ios/#releasenotes/DataManagement/RN-iCloudCoreData/_index.html

約束されたサンプルコードのほとんどがこれまでに表示されていないため、そのすべては少し不思議ですが、一方で、ほとんどの場合、推測するのはかなり簡単です。その他のヒントについては、WWDC2011セッション107、116、および315を参照してください。

ただし、レガシードキュメントの移行にこの方法を使用する場合は、移行NSPersistentStoreUbiquitousContentNameKey時にパッケージが変更されるため、移行する時点を設定しないでください。上記のドキュメントはそれを非常によく説明しています。

于 2011-12-11T18:01:31.477 に答える
1

このヒントをありがとう。もっと簡単な解決策を見つけたと思います。

UIManagedDocument古い永続ストアの場所とは異なるファイル名で新しいファイルを作成するだけです。

私のサブクラス化UIManagedDocumentされた では、メソッドをオーバーライドし、configurePersistentStoreCoordinatorForURLそこで一度移行を行います。

- (BOOL)configurePersistentStoreCoordinatorForURL:(NSURL *)storeURL ofType:(NSString *)fileType modelConfiguration:(NSString *)configuration storeOptions:(NSDictionary *)storeOptions error:(NSError **)error
{
    // If legacy store exists, copy it to the new location
    NSFileManager* fileManager = [NSFileManager defaultManager];
    if ([fileManager fileExistsAtPath:legacyPersistentStoreURL.path])
    {
        NSError* thisError = nil;
        [fileManager copyItemAtURL:legacyPersistentStoreURL toURL:storeURL error:&thisError];
        [fileManager removeItemAtURL:legacyPersistentStoreURL error:&thisError];
    }

    return [super configurePersistentStoreCoordinatorForURL:storeURL ofType:fileType modelConfiguration:configuration storeOptions:storeOptions error:error];
}
于 2011-12-11T19:54:32.897 に答える