Mit unserer App kann der Benutzer einen Standort aus einer Liste auswählen, die von einer API bereitgestellt wird. Die Liste wird nur selten und nur durch Hinzufügen von Elementen aktualisiert. Anstatt also jedes Mal auf die API zuzugreifen, wird die App mit einem Snapshot in einem Core Data-SQL-Store ausgeliefert, und wir möchten, dass die Liste regelmäßig aktualisiert wird. Der Code dafür funktioniert so:
Wenn Sie mit einer leeren DB beginnen, funktioniert das einwandfrei. Wenn wir es jedoch ein zweites Mal ausführen, schlägt es beim Speichern mit der Meldung "Fehler bei der SQL-Ausführung: Einschränkung ist fehlgeschlagen" fehl. Es tut dies, auch wenn ich es auf einen Ort beschränke. Wenn ich das SQL-Debugging aktiviere, sehe ich Folgendes:
%Vor%Dann verbindet es sich erneut und versucht es noch einmal, bevor es aufgibt.
Mein Code findet definitiv die alten Locations und die Objekte sind alle gültig - oder [object validateForUpdate] gibt YES zurück. Was bedeutet der Fehler? Gibt es eine Möglichkeit herauszufinden, welche Einschränkung fehlschlägt?
Wenn ich den binären Speicher verwende, verschwindet der Fehler - aber der binäre Speicher ist atomar und blockiert bei Schreibvorgängen ewig. Es sieht aus wie ein Fehler im SQLite-Shop - hat jemand einen Workaround gefunden?
Ich bemerkte, dass es INSERT INTO ZLOCATION
nicht UPDATE ZLOCATION
tat, also habe ich mir das Bit angeschaut, wo ich die Orte in den Kontext eingefügt habe. Ich hatte:
Was ich nicht wusste ist, dass für Objekte, die aus der Datenbank kommen, [object isInserted]
falsch ist . Also habe ich ein bereits eingefügtes Objekt eingefügt und es stürzte dadurch ab. Als ich es zu [object managedObjectContext] änderte, ging mein Problem weg.
Es ist wahrscheinlich ein Validierungsfehler. Wenn Sie über benutzerdefinierten Validierungscode verfügen, überprüfen Sie dies.
Eine überraschende Anzahl von seltsamen Fehlern mit Kontext resultiert aus Problemen mit Threads. Ich würde den Code auf dem vorderen Thread ausführen. Wenn es funktioniert, haben Sie ein Threading-Problem.
Tags und Links objective-c iphone core-data