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?
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% 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.
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.
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.
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.
Tags und Links xamarin sqlite.net