Wie vermeide ich "Fehler während der SQL-Ausführung: Einschränkung fehlgeschlagen", wenn ich meinen SQL-Core-Datenspeicher aktualisiere?

8

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:

  • Erstellen Sie einen verwalteten Objektkontext für den Thread
  • Holen Sie sich die vollständige Liste von der API
  • für jeden einzelnen:
    • finde den Ort im Kontext mit einer passenden locationID
    • Wenn nicht gefunden, fügen Sie ein neues in den Kontext
    • ein
    • Aktualisieren Sie den Standort mit den neuen Informationen
  • Speichern Sie den Kontext

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?

    
Simon 12.09.2011, 08:15
quelle

2 Antworten

6

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:

%Vor%

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.

    
Simon 30.09.2011, 11:23
quelle
1

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.

    
TechZen 13.09.2011 01:35
quelle

Tags und Links