ich eine einfache Einheit haben:Xamarin Sqlite Insert kehrt nicht zuletzt Primärschlüssel id
[Table("History")]
public class History
{
[PrimaryKey, AutoIncrement, Column("_id")]
public int Id { get; set; }
[Indexed(Name = "IDX_History", Order = 1, Unique = true)]
public int Prefix { get; set; }
[Indexed(Name = "IDX_History", Order = 2, Unique = true)]
public int Stem { get; set; }
[Indexed(Name = "IDX_History", Order = 3, Unique = true)]
public int Suffix { get; set; }
[Indexed(Name = "IDX_Favourite")]
public bool IsFavourite { get; set; }
public DateTime LastViewed { get; set; } = DateTime.Now;
}
Ich versuche, einen Einsatz, wenn seine neue oder erhalten die letzte Eingabe-ID zu tun, wenn es bereits vorhanden ist:
public static int SaveSolutionToHistory(Solution sol)
{
lock (_db)
{
var existingHistory = _db.Table<History>().FirstOrDefault(h => h.Prefix == sol.Prefix.Id
&& h.Stem == sol.Stem.Id
&& h.Suffix == sol.Suffix.Id);
if (existingHistory != null)
{
existingHistory.LastViewed = DateTime.Now;
_db.Update(existingHistory);
return existingHistory.Id;
}
_db.Insert(new History
{
Prefix = sol.Prefix.Id,
Stem = sol.Stem.Id,
Suffix = sol.Suffix.Id
});
return _db.ExecuteScalar<int>("SELECT last_insert_rowid()");
}
}
der obere Teil funktioniert gut in eine ID für bestehende Einträge Rückkehr aber aus irgendeinem Grunde des Einsatz Code gibt immer wenn es sollte das letzte Eingabe primäres autoincrement id zurückkehren (wie in den Methoden XML-Kommentar erwähnt):
_db.Insert(new History
{
Prefix = sol.Prefix.Id,
Stem = sol.Stem.Id,
Suffix = sol.Suffix.Id
});
Und das gibt den richtigen ID:
return _db.ExecuteScalar<int>("SELECT last_insert_rowid()");
Es scheint ineffizient für mich zwei Hits wie dies zu tun oder es als nicht zu tun, stark typisiert. Gibt es einen Grund, warum die _db.Insert
nicht die richtige ID zurückgibt?
Ich benutze VS 2015, mit HAXM und Marshmallow x86_64 Google API Image.