Frage

Ich habe das folgende Problem:

Ich habe eine App mit einer UitableView als Root -Ansicht. In diesem Tabellenbereich befinden sich unterschiedliche Einträge und für jeden Eintrag (der vom Benutzer erstellt werden kann) auch meiner App einen PersistentStore hinzugefügt.

Wenn ich die App von Grund auf neu starte (keine gespeicherten Daten usw.) und einen Eintrag hinzufüge, wird auch der PersistentStore erstellt, und wenn ich auf die TabelleViewCell klicke, kann ich Daten in diesem generierten PersistentStore speichern. Dies funktioniert gut, wenn ich einen Eintrag erstelle und den Eintrag auch während eines einzigen Laufs ansehe.

ABER

Wenn ich die App schließe und erneut starte, klicken Sie auf denselben Eintrag, erhalte ich die folgende Fehlermeldung:

NSFetchRequest *allUsers = [[NSFetchRequest alloc] init];
[allUsers setAffectedStores:[NSArray arrayWithObject:[[self.tableViewContext persistentStoreCoordinator] persistentStoreForURL:storeURL]]];

* Beenden Sie die App aufgrund der ungekordenen Ausnahme 'nsinvalidargumentException', Grund: '* -[nsarray initwithObjects: zählen:]: Versuch, kein Objekt in Objekte einzufügen [0] '

Es scheint also, dass ich ein Geschäft hinzufügen möchte, das tatsächlich Null ist, weil (ich denke, das), das System kann kein Geschäft unter diesem gegebenen Storeurl finden (das ist der gleiche wie der, in dem ich im ersten Lauf einen Laden erstellt habe) .

Ich denke, der PersistentStore ist im zweiten Lauf nicht da, daher wird er im ersten Lauf, in dem er erstellt wurde, nicht richtig gespeichert.

Wie kann ich also einen persistenten Store retten, nachdem ich es dem persistenten Storecoordinator hinzugefügt habe?

Aktualisieren:

Ich denke, ich habe das Hauptproblem identifiziert. Der persistentStorecoordinator hat sich nach dem ersten Lauf verändert. Wie speichere ich all diese Dinge (ManagedObjectContext, PersistentStorecoordinator), bevor ich die App schließe?

Kann mir jemand helfen?

Update 2

So erstelle ich den Laden:

    NSArray *searchPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentPath = [searchPaths objectAtIndex:0];
    NSString* storeFileName = [NSString stringWithFormat:@"%@",newItem.name];
    NSURL *storeURL = [NSURL fileURLWithPath:[documentPath stringByAppendingPathComponent:storeFileName]];                            
     NSError* saveToStoreError;
    if(![[self.addContext persistentStoreCoordinator] addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:nil error:&saveToStoreError]){
     NSLog(@"Error: %@, %@", saveToStoreError, [saveToStoreError userInfo]);
     abort();
    }
    else
    {
      NSError *saveStoreError;
      if(![self.addContext save:&saveStoreError])
      {
           NSLog(@"Saving Data wasn't possible!");
      }
    }

Update 3Nach vielen Tests hier sind meine Ergebnisse:

  • Die Schaffung der Geschäfte funktioniert einwandfrei. Ich kann mehrere Geschäfte erstellen und kann auf sie zugreifen und sie bevölkern, solange ich in einem einzigen Lauf meiner App bin.

Also ändert sich etwas mit einem Neustart meiner App. Ich denke, der Fehler muss mit dem ManagedObjectContext, dem persistentStorecoordinator oder dem Speichern der Geschäfte zugeordnet werden.

Sollte ich Einstellungen in meinem App -Delegierten ändern, um den ManagedObjectContext oder den persistentStorecoordinator einzurichten?

Vielen Dank!

War es hilfreich?

Lösung 4

Es war einfach einfach.

Ich habe nicht gesetzt addPersistentStoreWithType Nach dem Neustart in einer Ansicht, in der ich versucht habe, Daten aus diesem Geschäft abzurufen.

Entschuldigung für diesen Beitrag. Einfach einfach ;-) BangingmyheadonThewall

Andere Tipps

Die Art und Weise, wie Sie Ihr Problem sprechen, führt mich dazu, eine Art Verwirrung zu vermuten.

Dieser persistentierte Store ändert sich nach jedem Neustart. Ist das der übliche Fall?

Ja, so ist es! Ein NSPersistentStore ist ein Ziel-C-Objekt wie jedes andere Objekt. Als solches ist es bei den Starts nicht bestehen. Sie müssen es jedes Mal neu erstellen.

Was an einem NspersistentStore anhaltend ist, ist die Datei, auf die er verweist. Aber jedes Mal, wenn Sie Ihre Bewerbung ausführen, müssen Sie ein neues NSPersistentStore -Objekt neu erstellen, was wahrscheinlich auf dieselbe Datei hinweist (definiert durch die url Argument an initWithPersistentStoreCoordinator:configurationName:URL:options:).

Wie setzen Sie Ihre? storeURL Variable?

Verwenden Sie nsmanagedObjectContext "Speichern:" -Methode nach dem Hinzufügen eines neuen persistenten Speichers und bevor Sie die App schließen. Um zu prüfen, ob die persistenten Geschäfte ordnungsgemäß hinzugefügt wurden, verwenden Sie die NSPERSISTENTSTORECOORDINATOR -Methode "PersistentStores", um die verfügbaren gültigen Filialen zu bestimmen.

Ich frage mich, ob das Problem nicht die Kerndatenaufrufe nicht so sehr als wenn sie angerufen werden?

Wenn Sie "die App schließen und erneut beginnen" ... wird die App dazwischen terminiert oder ist sie Hintergrund? IIRC, das sich subtil auf das auswirkt, was in Ihrem App -Delegierten aufgerufen wird. Abhängig davon, wie die Dinge dort angeordnet sind, wird WRT -Kerndaten möglicherweise versehentlich aufgerufen (oder verpasst).

Ich wäre daran interessiert zu sehen, was passiert, wenn Sie jede einzelne Methode mit den Einzelpersonen in Ihrem App-Delegierten (oder wo immer sie sich befinden) verfolgen, um festzustellen, ob Sie es mehr rotes fangen können. (Wenn irgendwo ein minimaler Testfall veröffentlicht wird, teilen Sie dies bitte mit!)

Schauen Sie sich die Fensteranwendung in den Xcode-Vorlagen an.

Dies schafft einen ganzen Kerndatenstapel für Sie - persistierender Laden, persistierender Ladenkoordinator und verwalteter Objektkontext.

Unter der Annahme, dass Ihre Bewerbung nicht ausdrücklich erforderlich ist, sollten Sie nur einen persistenten Laden haben. Dies ist in der Tat die Datei, in die die Daten geschrieben werden. Wenn Sie sich Ihren Code ansehen, versuchen Sie, jedes Mal, wenn Sie Daten speichern, Ihren eigenen Speicher zu erstellen.

Sie sollten die Kerndatenstapelmethoden aus der oben vorgeschlagenen Vorlage kopieren. Sie müssen sich nicht auf den persistenten Laden oder den persistenten Ladenkoordinator beziehen. Alles, was Sie benötigen, ist der vom App -Delegierten erstellte verwaltete Objektkontext.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top