UIManagedDocument solo puede leer documentos que son packages de files

Mi aplicación está utilizando una database SQLite. Me gustaría permitir que mis usuarios usen iCloud para sincronizarlo entre dispositivos, y estaba pensando que podría usar UIManagedDocument.

Lo subclasé, siguiendo la documentation de Apple, y funciona cuando es necesario crear un nuevo file de tienda persistente. Sin embargo, cuando trato de usarlo para abrir mi antiguo file de almacenamiento persistente, obtengo el siguiente error de exception:

"UIManagedDocument solo puede leer documentos que son packages de files"

¿Significa esto que necesito migrar la antigua tienda persistente a una nueva tienda administrada por UIManagedDocument? Si es así, ¿tengo que hacer esto manualmente (es decir, leer cada logging uno por vez desde la tienda anterior y escribirlo en el nuevo)?

¡Gracias por adelantado!

UIManagedDocument crea packages (carpetas) en lugar de tiendas atómicas. La tienda todavía está allí, pero está enterrada en el package. Si hace clic con el button derecho en el file creado en la carpeta Documentos en el simulador, podrá ver la estructura. El valor pnetworkingeterminado es

mydocument.foo -> StoreContent -> persistentStore 

Lo que debe hacer es crear una nueva extensión para su tipo de file de aplicación, por ejemplo, si su extensión de database es .myappdb , debe crear un nuevo tipo de documento en la configuration de su proyecto, que puede ser .myappdbw . Puede copyr todas las configuraciones de la input para .myappdb

A continuación, en el punto donde manejas la apertura de tu documento henetworkingado en mydocumenturl lugar de pasar eso a tu coordinador de almacén persistente, creas la estructura de directory arriba.

 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"]; 

y luego mueva la database henetworkingada al sistema de carpetas que ha creado

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

y luego puede pasar la URL del package a UIManagedDocument

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

Un enlace que será útil para la integración de iCloud es

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

Es todo un poco misterioso ya que la mayoría del código de muestra prometido no ha aparecido hasta ahora, pero por otro lado es bastante simple de deducir. Eche un vistazo a las sesiones 107.116 y 315 de WWDC2011 para get más pistas.

Pero tenga en count que si va a utilizar este método para migrar sus documentos henetworkingados, NO configure NSPersistentStoreUbiquitousContentNameKey en el punto en el que migre porque el package cambia cuando lo hace. El documento anterior lo describe bastante bien.

Gracias por este consejo. Creo que encontré una solución aún más simple.

Acabo de crear un nuevo UIManagedDocument con un nombre de file diferente al de mi antigua location de tienda persistente.

En mi UIManagedDocument subclasificado, UIManagedDocument el método configurePersistentStoreCoordinatorForURL y hago la migration una vez allí:

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