iOS UIManagedDocument: no se puede abrir el almacén persistente pre cargado

Estoy intentando cargar previamente una tienda persistente en una aplicación basada en UIManagedDocument para tratar con los datos principales.

La tienda persistente que bash utilizar en la aplicación B, se "genera" y se completa gracias a la aplicación A. En ambas aplicaciones, A y BI utilizan el manejador UIManagedDocument de Justin Driscoll ( disponible aquí , ¡gracias a Mister Driscoll!). Todo funciona perfectamente en la aplicación A.

En function de la técnica explicada en este hilo: Cargue previamente la database de datos básicos en iOS 5 con UIManagedDocument , bash poner la tienda persistente en el package de aplicaciones de B y copyr esta tienda en la carpeta de documentos si es necesario (si no se hace antes) en init justo antes de la creación de instancias.

Copiar todo el package a los documentos está bien (probé un método diferente y comprobé la creación gracias al buscador y nslog), pero simplemente no puedo abrir el "documento". La aplicación no se bloquea, las vistas se muestran pero las tablas están vacías (uso exactamente el mismo código que la aplicación A, con el mismo fetchedResultsController). Primero pensé que la tienda persistente copyda estaba vacía, entonces me di count de que simplemente no puedo abrir correctamente el documento / almacén persistente copydo) => Estado del documento = 5, es decir, un error de UIDocumentStateClosed y UIDocumentStateSavingError (si lo interpreto correctamente? )

(Nota: También he intentado instanciar y abrir el documento directamente desde el package y tengo el mismo problema: estado doc = 5)

Entonces … Tres días luchando con este documento estado = 5 y no hay idea sobre qué arreglar

Me imagino que hay algo mal con el file que pongo en el package de la aplicación B (actualmente arrastro y suelto desde el buscador a xcode con "Crear references de carpeta para cualquier carpeta agregada" seleccionada) Tal vez se trata de algunas opciones o metadatos o files permissions o …

¿Alguna idea sobre qué investigar?

(No creo que se trata del siguiente código, pero bueno …) Así es como inicio (basado en el controller Justin Driscoll. Solo custo es: verifico si hay un package de tienda en la carpeta de documentos, si no lo creo basado en el file en el package)

- (id)init { self = [super init]; if (self) { self.document = nil; NSLog(@"--- INIT ---"); // On vérifie si il ya un dossier "My-Default-Document-As-Database" (notre persitent store) dans le dossier "Documents" NSString *docDirectory = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0]; NSString *docFolderPath = [docDirectory stringByAppendingPathComponent:@"My-Default-Document-As-Database"]; if (![[NSFileManager defaultManager] fileExistsAtPath:docFolderPath]) { NSError *error = nil; NSLog(@"Pas de fichier trouvé à l'adresse docFolderPath, on va donc y créer notre persistent store"); // COPY FROM BUNDLE NSFileManager *fileManager = [NSFileManager defaultManager]; NSString *DB = [docFolderPath stringByAppendingPathComponent:@"StoreContent"]; [fileManager createDirectoryAtPath:DB withIntermediateDirectories:YES attributes:nil error:&error]; NSLog(@"create directory error: %@",error); DB = [DB stringByAppendingPathComponent:@"persistentStore"]; NSString *shippedDB = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"persistentStore"]; NSLog(@"%d",[fileManager fileExistsAtPath:shippedDB]); [fileManager copyItemAtPath:shippedDB toPath:DB error:&error]; NSLog(@"Copy error %@",error); } NSLog(@"== My-Default-Document-As-Database OK DANS DOCUMENTS =="); NSURL *myDbUrl = [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject]; myDbUrl = [myDbUrl URLByAppendingPathComponent:@"My-Default-Document-As-Database/"]; self.document = [[UIManagedDocument alloc] initWithFileURL:myDbUrl]; NSLog(@"== initWithFileUrl =="); // Set our document up for automatic migrations NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys: [NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption, [NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption, nil]; self.document.persistentStoreOptions = options; // Register for notifications [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(objectsDidChange:) name:NSManagedObjectContextObjectsDidChangeNotification object:self.document.managedObjectContext]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(contextDidSave:) name:NSManagedObjectContextDidSaveNotification object:self.document.managedObjectContext]; } return self; } 

Solo "modificaciones" que hice en el código performWithDocument provisto por Mr Driscoll son algunos nslog para ver lo que está sucediendo (el estado doc va del 1 al 5 en cada primer bash abierto y luego se adhiere a 5 …)

 - (void)performWithDocument:(OnDocumentReady)onDocumentReady { NSLog(@"passage par performWithDoc"); void (^OnDocumentDidLoad)(BOOL) = ^(BOOL success) { NSLog(@"FilePath Apres = %@",[self.document.fileURL path]); NSLog(@"STATE === %d", self.document.documentState); onDocumentReady(self.document); }; NSLog(@"FilePath Avant = %@",[self.document.fileURL path]); NSLog(@"STATE === %d", self.document.documentState); if (![[NSFileManager defaultManager] fileExistsAtPath:[self.document.fileURL path]]) { [self.document saveToURL:self.document.fileURL forSaveOperation:UIDocumentSaveForCreating completionHandler:OnDocumentDidLoad]; NSLog(@"performWithDoc > fileexistAtPath nope => saveToURLForCreating"); NSLog(@"STATE === %d", self.document.documentState); } else if (self.document.documentState == UIDocumentStateClosed) { [self.document openWithCompletionHandler:OnDocumentDidLoad]; NSLog(@"performWithDoc > UIDocStateClosed => openWithCompletionHandler"); NSLog(@"STATE === %d", self.document.documentState); } else if (self.document.documentState == UIDocumentStateNormal) { OnDocumentDidLoad(YES); NSLog(@"performWithDoc > docState = normal => docdidLoad(YES)"); } NSLog(@"STATE === %d", self.document.documentState); } 

Gracias a un compadre, esta es la respuesta … si alguien la busca:

¡Se trataba de opciones!

Agregue NSIgnorePersistentStoreVersioningOption a las opciones de pesistenStore en el init.

Con respecto al código anterior, debería tener algo como esto:

 // Set our document up for automatic migrations NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys: [NSNumber numberWithBool:YES], NSIgnorePersistentStoreVersioningOption, [NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption, [NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption, nil]; self.document.persistentStoreOptions = options;