2012-04-26 12 views
6

Estoy usando Core Data en una aplicación existente. Ahora quiero integrar iCloud para que el usuario pueda sincronizar sus contenidos entre sus dispositivos iOS. Para hacer esto que he escrito el siguiente código para mi NSPersistentStoreCoordinator (por supuesto, los marcadores de posición son llenados en mi código):iOS: migración de la base de datos Core Data existente a iCloud

- (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_; 
} 

Con ese código todos los nuevos registros de datos agregados se sincronizan automáticamente entre todos iOS- dispositivos, por lo que funciona exactamente como debería!

Pero lo que quiero es que también todos los registros de datos existentes se sincronicen entre todos los dispositivos; eso no funciona todavía Los registros existentes todavía están disponibles en la aplicación y se pueden usar, pero no están sincronizados.

¿Qué debo hacer para obtener todos los registros de datos existentes sincronizados con iCloud también? He experimentado un poco con el método

migratePersistentStore:toURL:options:withType:error: 

pero sin ningún éxito.

¡Estoy muy agradecido por cualquier ayuda!

+0

Necesita un código especial para migrar datos existentes. Google alrededor, ya había soluciones. También puede consultar este hilo en el foro de desarrolladores de Apple: https://devforums.apple.com/thread/126670?tstart=0, debe tener un ID de desarrollador válido para acceder a él. Mire al final del hilo primero (es bastante largo). –

Respuesta

1

Busque la sesión de WWDC 2012 usando CoreData con iCloud. Discuten esto durante la sección final, bajo el tema de la siembra. También tienen un código de muestra que puede obtener del sitio que tiene un ejemplo. En resumen, tendrá que abrir 2 tiendas persistentes, establecer un tamaño de búsqueda, luego tomar lotes de la fuente, recorrerlos y agregarlos a la nueva tienda, y en los intervalos de tamaño de lote, guardar y restablecer. Bastante simple.

Cuestiones relacionadas