2016-11-02 4 views
1

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.

Antwort

2

hatte ich das gleiche Problem, fand nur die Antwort here der volle XML-Kommentar ist:

// 
// Summary: 
//  /// Inserts the given object and retrieves its /// auto incremented primary key 
//  if it has one. /// 
// 
// Parameters: 
// obj: 
//  /// The object to insert. /// 
// 
// Returns: 
//  /// The number of rows added to the table. /// 

Was die Zusammenfassung bedeutet durch „abruft“ ist, dass es den Wert des PK Feldes aktualisiert im Objekt Wenn Sie die letzte eingefügte ID verwenden möchten, können Sie diese verwenden

0

Sie können Zeilen in die Datenbank einfügen mit Einfügen einfügen. Wenn die Tabelle automatisch inkrementierte Primärschlüssel enthält, dann wird der Wert dieses Schlüssels wird nach dem Einsatz zur Verfügung stehen:

public static void AddStock (SQLiteConnection db, string symbol) { 
    var s = new Stock { Symbol = symbol }; 
    db.Insert (s); 
    Console.WriteLine ("{0} == {1}", s.Symbol, s.Id); 
} 

Dies ist die ID bedeuten in Objektfeld Id verfügbar sein wird.

https://components.xamarin.com/gettingstarted/sqlite-net