2016-08-11 1 views
2

Ich hatte kürzlich eine Herausforderung festgestellt. Ich würde es sehr schätzen, wenn irgendjemand Unterstützung geben könnte.NSFetchedResultsController (Core Data) stellt keine korrekte Datenquelle zur Verfügung Tabellenansicht Controller

Das Problem: NSFetchedResultsController (Core Data) bietet keine korrekte Datenquelle Table View Controller.

Was ich versuche zu erreichen:

  • ich meine Wolkenjunge als Hauptdatenbank bin mit der die meisten der Benutzerdaten speichert.
  • Ich verwende Core Data, um die CKRecordID und recordChangeTag lokal zu speichern, um die Tabellenansicht und die Sammlungsansicht mit diesen gespeicherten Werten als Handle zu aktualisieren, um verwandte CloudKit-Daten abzurufen.
  • Ich habe NSFetchedResultsController als Instanzvariable des Table View Controllers erstellt, um Datenergebnisse als Datenquelle der Tabellenansicht abzurufen.

Was funktioniert:

  • Die Wolkenjunge Datenbank speichern, ändern und CKRecord über die App löschen.
  • Ohne die Verwendung von Core Data NSFetchedResultsController, in der sich nur CloudKit und Table View in der letzten Version des Projekts befinden, kann die App CloudKit-Daten laden, um die Tabellenansicht als Datenquelle über die praktische CloudKit-API bereitzustellen. Datenänderung und Löschung funktionieren auch.

was Fehler bekomme ich:

  • Jetzt habe ich Wolkenjunge, Core Data und Tabelle View-Controller-Instanz-Variable NSFetchedResultsController, als ich versuchte, ein neues Objekt in den Stammdaten hinzufügen Datenbank und eine neue Tabellenansicht Zeile einzufügen, wird der folgende Fehler in der Konsole und der app crash gedruckt:

    • timicip_APITest_CloudKit_TableView_StoringRecordID [37142: 1.567.814] *** 0.123.Beenden der App aufgrund einer nicht abgefangenen Ausnahme 'NSInternalInconsistencyException', Grund: 'Ungültige Aktualisierung: ungültig Anzahl der Zeilen in Abschnitt 0. Die Anzahl der in einem vorhandenen Abschnitt nach der Aktualisierung (0) muss der Anzahl entsprechen Zeilen in diesem Abschnitt vor der Aktualisierung enthalten (0), plus oder minus die Anzahl der Zeilen eingefügt oder gelöscht aus diesem Abschnitt (1 eingefügt, 0 gelöscht) und plus oder minus der Anzahl der Zeilen in oder aus verschoben Abschnitt (0 bewegt in, 0 ausgezogen). '*

Was habe ich getan, das nicht funktioniert:

  • Ich habe versucht, das neue Objekt, um sicherzustellen, in die Core Data verwalten persistente Speicher gespeichert wird durch den Aufruf managedObjectContext.save() jedes Mal, wenn ich einen neuen Datensatz in den Einsatz Datenbank.Aber auch nachdem ich das getan hatte, versucht die Tabellenansicht Daten von NSFetchedResultsController zu holen, der NSFetchedResultsController liefert nicht die korrekte Menge seiner abgerufenen Objekte in der Tabellenansicht Datenquellenmethode "tableView (tableView: UITableView, numberOfRowsInSection-Abschnitt: Int) -> Int ". Und die App stürzt ab. Aber wenn ich die App wieder öffne, werden die Daten, die ich zuletzt geöffnet habe, in der Tabellenansicht angezeigt, und wenn ich ein neues Objekt zur Tabellenansicht hinzufüge, stürzt es immer noch ab.

Was ich denke, die Richtung der Lösung:

  • Ich bin nicht sicher, ob die „managedObjectContext.save()“ Anruf wirklich die Daten speichern, noch bin ich sicher, ob die Verwendung von "NSFetchedResultsController.sections! [Section] .numberOfObjects" gibt die gespeicherten Objekte zurück.
  • Muss ich eine neue Abrufanforderung von der Datenbank erstellen, indem ich "executeFetchRequest: error: on NSManagedObjectContext" zu den Ergebnissen aufruft. Wenn diese Methode verwendet wird, muss NSFetchedResultsController speziell für die Tabellenansicht entwickelt werden .
  • Erfordert "insertRowsAtIndexPaths (indexPaths: [NSIndexPath], withRowAnimation animation: UITableViewRowAnimation)" irgendwelche Support-Codes, um sicherzustellen, dass die Tabellenansicht mit korrigiertem indexPath aktualisiert wird?

Zusammenfassung:

Ich würde gerne wissen, wie die gedruckte Fehler zu überwinden, so dass ich eine neue Zeile in die Tabellenansicht mit Core Data Datenbank hinzufügen könnte die richtige Menge an Objekten aus dem managedObjectContext Fütterung .

Lösung:

die NSFetchedResultsControllerDelegate Implement, und lassen Sie es die CRUD Fluss für die Tabellenansicht vollständig zu kontrollieren, statt regulären Tabellenansicht Reihen Einfügen aufrufen, Methoden außerhalb der Methoden ‚NSFetchedResultsControllerDelegate löschen, weil Kern Der NSFetchedResultsController von Daten fungiert als Datenquelle.

Vielen Dank

Grüße,

张靖 元 (Jingyuan Ritter Zhang)

+0

Haben Sie den Delegaten für den NSFetchedResultsController festgelegt? Wenn es nicht festgelegt ist, überwacht der FRC den Kontext nicht auf Änderungen und es wird folglich nicht mit den Änderungen übereinstimmen, die Sie vornehmen. – pbasdf

+0

Danke für den Hinweis, ich hatte den Delegierten noch nicht implementiert, und ich werde es versuchen. Wenn ich es implementiere, sollte ich den Delegaten zum Aktualisieren der Tabellenansicht verwenden oder muss ich "InsertRowsAtIndexPaths" noch manuell in der Tabellenansicht aufrufen? – MKD

+0

Ich hatte NSFetchedResultsControllerDeleagate implementiert. Es funktioniert, das Einfügen und Löschen wirkt auch sehr reaktionsschnell. Danke für den Hinweis – MKD

Antwort

3

Lösung:

die NSFetchedResultsControllerDelegate Implement, und lassen Sie es die CRUD Fluss für die Tabellenansicht vollständig steuern Anstatt Methoden zum Einfügen von Tabellenzeilen zu verwenden, löschen Sie Methoden außerhalb der Methoden von NSFetchedResultsControllerDelegate, da NSFetchedResultsController von Core Data als Datenquelle fungiert.

Verwandte Themen