Wie verwende ich InsertOrReplace in sqlite.net PCL?

7

Ich benutze die PCL-Version von sqlite.net von hier ( Ссылка ).

Hier ist meine einfache Klasse.

%Vor%

Wenn eine neue Instanz von LogEntry erstellt wird, wird der Schlüssel automatisch auf 0 gesetzt. Ich setze das Datum auf etwas und rufe dann InsertOrReplace auf. Der Datensatz wird in meiner Datenbank gespeichert. Das Schlüsselfeld erhält den Autoinkrementierungswert, der 0 ist, da es der erste Datensatz ist.

Ich erstelle dann eine neue Instanz von LogEntry (Schlüssel wird automatisch auf 0 initialisiert) und setze das Datum auf etwas anderes. Ich rufe dann InsertOrReplace auf. Da es einen vorhandenen Datensatz mit einem Schlüssel von 0 gibt, wird der Datensatz aktualisiert.

Was ist der richtige Weg, damit umzugehen? Ich überlegte, den Schlüssel auf -1 zu initialisieren, aber das schien auch nicht zu funktionieren.

Hat jemand ein Beispiel dafür?

    
Darrell 20.08.2014, 16:26
quelle

4 Antworten

8

Ich habe das gleiche Problem erlebt, das Sie beschreiben. Probieren Sie

aus %Vor%

Ich habe es gerade oben versucht und es funktioniert wie erwartet

    
joacar 27.08.2014, 10:32
quelle
19

Wenn Sie den Schlüssel in einen nullbaren Typ (int?) ändern, sollte es funktionieren. dann sieht SQLite, dass null eingeht und erzeugt bei Bedarf eine neue ID.

%Vor%     
Kevin Kraemer 24.02.2015 19:35
quelle
1

Die Art und Weise, wie dies funktioniert, führt zu großer Verwirrung, aber Insert behandelt zeroed Primärschlüssel als Sonderfall, wenn AutoIncrement gesetzt ist, InsertOrReplace nicht.

Also mit:

%Vor%

Wenn Sie InsertOrReplace eine Reihe von Null-ID-Datensätzen in einer neuen Tabelle haben, wird die erste in id: 0 gespeichert und jede nachfolgende wird darüber speichern. Während wenn Sie nur Insert jeder dann wegen der AutoIncrement die erste speichert bei id: 1 und die nächste bei id: 2 usw., wie Sie vielleicht erwarten.

Wenn Sie den Schlüsseltyp in einen nullwertfähigen int ändern, werden Datensätze mit Null-IDs als Einfügungen von InsertOrReplace behandelt, und Sie benötigen das AutoIncrement -Attribut überhaupt nicht. In diesem Fall werden sie trotzdem beibehalten Speichern Sie in Reihenfolge ab 1.

%Vor%

Wenn Sie das aus irgendeinem Grund nicht verwenden können, können Sie Ihre eigene Überprüfung für Null-IDs durchführen und für diese stattdessen Insert aufrufen, z.

%Vor%

In diesem Fall müssen Sie jedoch das AutoIncrement -Attribut verwenden, andernfalls wird die erste Null-Einfügung bei 0 gespeichert, und die zweite wird eine bedingte Ausnahme ausgeben, wenn sie versucht, eine andere solche einzufügen.

    
stovroz 05.04.2016 14:50
quelle
0

Meine Lösung ist der von Joacar ähnlich, aber anstatt ein Update zu machen, wähle ich das Element aus, wenn es null ist, erstelle ich ein neues Element, aktualisiere sonst diese Elementwerte und rufe dann InserOrReplace auf.

> %Vor%

Es ist vielleicht nicht optimal, aber es hat für mich funktioniert.

    
seFausto 27.10.2014 17:46
quelle

Tags und Links