6

既存のアプリケーションで Core Data を使用しています。ここで、ユーザーが iOS デバイス間でコンテンツを同期できるように、iCloud を統合したいと考えています。そのために、NSPersistentStoreCoordinator 用に次のコードを作成しました (もちろん、プレースホルダーはコードに入力されています)。

- (NSPersistentStoreCoordinator *)persistentStoreCoordinator {

if (persistentStoreCoordinator_ != nil) {
    return persistentStoreCoordinator_;
}

NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"<DB_Name>.sqlite"];

persistentStoreCoordinator_ = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];

NSPersistentStoreCoordinator* psc = persistentStoreCoordinator_;

if (IOS_VERSION_GREATER_THAN_OR_EQUAL_TO(@"5.0")) {
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        NSFileManager *fileManager = [NSFileManager defaultManager];

        // Migrate datamodel
        NSDictionary *options = nil;

        // this needs to match the entitlements and provisioning profile
        NSURL *cloudURL = [fileManager URLForUbiquityContainerIdentifier:@"<App_Identifier>"];
        NSString* coreDataCloudContent = [[cloudURL path] stringByAppendingPathComponent:@"data"];
        if ([coreDataCloudContent length] != 0) {
            // iCloud is available
            cloudURL = [NSURL fileURLWithPath:coreDataCloudContent];

            options = [NSDictionary dictionaryWithObjectsAndKeys:
                       [NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption,
                       [NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption,
                       @"<App_Name>.store", NSPersistentStoreUbiquitousContentNameKey,
                       cloudURL, NSPersistentStoreUbiquitousContentURLKey,
                       nil];
        } else {
            // iCloud is not available
            options = [NSDictionary dictionaryWithObjectsAndKeys:
                       [NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption,
                       [NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption,
                       nil];
        }

        NSError *error = nil;
        [psc lock];
        if (![psc addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:options error:&error])
        {
            NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
        }
        [psc unlock];

        dispatch_async(dispatch_get_main_queue(), ^{
            NSLog(@"asynchronously added persistent store!");
            [[NSNotificationCenter defaultCenter] postNotificationName:@"RefetchAllDatabaseData" object:self userInfo:nil];
        });

    });

} else {
    NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:
                             [NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption,
                             [NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption,
                             nil];

    NSError *error = nil;
    if (![persistentStoreCoordinator_ addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:options error:&error])
    {
        NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
    }
}

return persistentStoreCoordinator_;
}

このコードを使用すると、新しく追加されたすべてのデータ レコードがすべての iOS デバイス間で自動的に同期されるため、本来の方法で正確に機能します。

しかし、私が望むのは、すべての既存のデータ レコードもすべてのデバイス間で同期されることです。それはまだ機能しません。既存のレコードは引き続きアプリ内で使用でき、使用できますが、同期されません。

既存のすべてのデータ レコードも iCloud と同期するにはどうすればよいですか? その方法を少し試してみました

migratePersistentStore:toURL:options:withType:error:

しかし、何の成功もありません。

どんな助けにもとても感謝しています!

4

2 に答える 2

1

WWDC 2012 セッション Using CoreData with iCloud を参照してください。これについては、シードのトピックの下で、最後のセクションで説明します。また、例のあるサイトから取得できるサンプル コードもいくつかあります。つまり、2 つの永続ストアを開き、フェッチ サイズを設定してから、ソースからバッチを取得し、それらをループして新しいストアに追加し、バッチ サイズの間隔で保存してリセットする必要があります。ものすごく単純。

于 2012-09-20T23:40:30.180 に答える
0

WWDC 2012 - Using core data with iCloud をチェックしてください。この手法はシードと呼ばれます。サンプル コードはhttps://github.com/jab5990/TestCDiCloud/tree/master/Sharedにあります。

于 2013-03-17T05:52:11.033 に答える