2013-01-18 13 views
5

Ich versuche, einen persistenten Speicher in einer App basierend auf UIManagedDocument vorzuladen, um mit den Kerndaten umzugehen.iOS UIManagedDocument: Vorinstallierter persistenter Speicher kann nicht geöffnet werden

Persistent Store Ich versuche, in app B zu verwenden, wird "erzeugt" behandelt und dank App A. In beiden App A und B Ich verwende den UIManagedDocument Handler von Justin Driscoll (available here dank Herr Driscoll!). Alles funktioniert perfekt in App A.

Basierend auf der Technik in diesem Thread: Pre-load core data database in iOS 5 with UIManagedDocument, ich versuche, den persistenten Speicher in den App-Bundle von B zu setzen, und diesen Speicher im Dokumentenordner bei Bedarf zu kopieren (wenn nicht (done vorher) in init kurz vor der Instanziierung.

Kopieren von Bundle zu Dokumenten ist alles in Ordnung (Ich versuchte andere Methode und überprüfte die Erstellung dank Finder und NSLog), aber ich kann einfach nicht das "Dokument" öffnen. App wird nicht abstürzen, Ansichten werden angezeigt, aber die Tabellen sind leer (ich verwende genau denselben Code wie App A, mit demselben abgerufenenResultsController). Zuerst dachte ich, dass der kopierte persistente Speicher leer war, dann erkannte ich, dass ich das Dokument/den kopierten persistenten Speicher einfach nicht richtig öffnen konnte) => Dokumentstatus = 5, was einen Fehler von UIDocumentStateClosed und UIDocumentStateSavingError bedeutet (wenn ich es richtig interpretiere ?? ?)

(Anmerkung: ich habe auch direkt aus dem Bündel, das Dokument zu instanziieren und öffnen versucht, und ich habe das gleiche Problem habe: doc state = 5)

So ... Drei Tage kämpfen mit Dieses Dokument Status = 5 und keine Ahnung, was zu beheben

Ich stelle mir vor, dass etwas mit der Datei falsch ist, die ich in das Bündel von App B (derzeit Drag & Drop von Finder zu xcode mit "Create Ordnerreferenzen für alle hinzugefügten Ordner" ausgewählt) Vielleicht geht es um einige Optionen oder Metadaten oder Dateiberechtigungen oder ...

Eine Idee, was zu untersuchen?

(Ich glaube nicht, es geht um den folgenden Code aber gut ...) Hier ist, wie ich init (basierend auf Justin Driscoll Handler. Nur custo ist: Ich überprüfe, ob es ein Geschäftspaket im Dokumentenordner, wenn nicht, dass ich es auf die Datei in dem Bündel)

- (id)init 
{ 
self = [super init]; 
if (self) { 
    self.document = nil; 

    NSLog(@"--- INIT ---"); 

    // On vérifie si il y a 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; 
} 

Nur „Modifikationen“ ich auf dem performWithDocument Code vorgenommen, die von Herrn Driscoll sind einige NSLog zu sehen, basierend schaffen, was von 1 bis 5 auf jeder Gos hapening (doc Zustand zuerst öffnen versuchen und dann bei 5 bleiben ...)

Antwort

2

Dank eines Compadre, hier ist die Antwort ... wenn jemand danach sucht:

Es ging um Optionen !!

Fügen Sie NSIgnorePersistentStoreVersioningOption zu den pesistenStore-Optionen in der init hinzu.

vorherigen Code angeht, sollten Sie etwas wie dieses:

// 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; 
+0

Für iOS diese Optionen nicht vorhanden sind. Der Code in den Fragen funktionierte ohne diese Optionen. – vaichidrewar

+0

@vaichidrewar seltsam, nicht für mich in der Tat. Ich muss diese Option NSIgnorePersistentStoreVersioningOption hinzufügen, um den migrierten persistentenStore verwenden zu können (ohne Option weigert sich die App immer, den Speicher zu öffnen).Optionen sind im iOS Dokument hier beschrieben: http://developer.apple.com/library/ios/#Documentation/Cocoa/Reference/CoreDataFramework/Classes/NSPersistentStoreCoordinator_Class/NSPersistentStoreCoordinator.html – macbeb

+0

Ich denke, ich wollte sagen, dass diese nicht benötigt werden iphone ios. Xcode hat diese Optionen bei der Entwicklung der iPhone App nicht erkannt. Aber diese sollten für Mac-App – vaichidrewar