2016-05-06 5 views
0

ich InsertAll bin mit einem ObservableCollection TickRecords in SQLite-Datenbank zu speichern:Warum InsertAll in SQLITE abstürzt?

private static readonly ObservableCollection<TickRecord> TickRecords = new ObservableCollection<TickRecord>(); 

TickRecord ist wie folgt zu definieren: `

public class TickRecord : INotifyPropertyChanged 
{ 
// 
// Primary Key 
// 
private long _key; 
[PrimaryKey] 
public long Key 
    { 
    get 
     { 
     return _key; 
     } 
    set 
     { 
     _key = value; 
     OnPropertyChanged("Key"); 
     } 
    } 


// 
// Timestamp 
// 
private DateTime _tickStartDate; 
public DateTime TickStartDate 
    { 
    get 
     { 
     return _tickStartDate; 
     } 
    set 
     { 
     _tickStartDate = value; 
     OnPropertyChanged("TickStartDate"); 
     } 
    } 

private DateTime _tickEndDate; 
public DateTime TickEndDate 
    { 
    get 
     { 
     return _tickEndDate; 
     } 
    set 
     { 
     _tickEndDate = value; 
     OnPropertyChanged("TickEndDate"); 
     } 
    } 


// 
// Record Duration in Seconds 
// 
private byte _durationInSeconds; 
public byte DurationInSeconds 
    { 
    get 
     { 
     return _durationInSeconds; 
     } 
    set 
     { 
     _durationInSeconds = value; 
     OnPropertyChanged("DurationInSeconds"); 
     } 
    } 

und in SQLITE Speichern wie dies geschehen ist:

await CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync(CoreDispatcherPriority.High,() => Database.Database.AddAllTickRecords(TickRecords)); 

und AddAllTickRecords ist wie folgt definiert:

public static void AddAllTickRecords(IEnumerable<TickRecord> list) 
    { 
    using (var db = new SQLiteConnection(new SQLitePlatformWinRT(), DbPath)) 
     { 
     db.InsertAll(list); 
     } 
    } 

Eine Idee, warum ich hier einen Fehler bekomme?

Der Fehler, den ich aus dem Debugger bekommen ist:

**An exception of type 'SQLite.Net.SQLiteException' occurred in SQLite.Net.dll but was not handled in user code 
Additional information: Constraint** 

and 

    **{SQLite.Net.SQLiteException: Constraint 
    at SQLite.Net.PreparedSqlLiteInsertCommand.ExecuteNonQuery(Object[] source) 
    at SQLite.Net.SQLiteConnection.Insert(Object obj, String extra, Type objType) 
    at SQLite.Net.SQLiteConnection.Insert(Object obj) 
    at SQLite.Net.SQLiteConnection.<>c__DisplayClass100_0.<InsertAll>b__0() 
    at SQLite.Net.SQLiteConnection.RunInTransaction(Action action) 
    at SQLite.Net.SQLiteConnection.InsertAll(IEnumerable objects, Boolean runInTransaction) 
    at BTLE.Database.Database.AddAllTickRecords(IEnumerable`1 list) 
    at BTLE.MainPage.<>c.<DecodeMessageResponse>b__123_0()}** 

Antwort

1

Basierend auf dem Fehler, den Sie bekommen (SQLite.Net.SQLiteException: Constraint), ist das Problem nicht zu Ihrem Code bezieht, sondern auf die Daten, die Sie versuchen, einzufügen . Sie scheinen gegen eine für die Tabelle in der Datenbank definierte Einschränkung zu verstoßen (z. B. eine eindeutige Integritätsbedingung für eines der Felder oder eine NULL-Einschränkung).

Um die Ursache zu finden, überprüfen Sie zuerst die Abhängigkeiten in der Datenbank, um zu sehen, mit welcher Art von Einschränkung Sie es zu tun haben. Überprüfen Sie dann den Inhalt der Liste, bevor Sie aufrufen. Wenn Sie immer noch nicht erkennen können, was das Problem verursacht, können Sie versuchen, Ihre Liste zu teilen und nur einen Teil davon zu speichern, um den fehlerhaften Datensatz zuerst zu identifizieren.

+0

Hallo, ist es möglich, dass ich versuche, einen Datensatz einzufügen, der bereits in der Tabelle vorhanden ist, und damit hat InsertAll ein Problem? Wenn ja, gibt es eine Möglichkeit, "InsertUpdateAll"? Thx –

+0

Ja, das könnte der Grund sein. Der Versuch, einen bereits eingefügten Datensatz erneut einzufügen, sollte eine Verletzung der Eindeutigkeitsregel für den Primärschlüssel verursachen. Wenn man SQLite.Net betrachtet, gibt es eine 'InsertAndReplaceAll'-Methode, die das tun kann, was Sie wollen; Ich habe es noch nicht ausprobiert. Andernfalls müssen Sie Ihre Datensätze in zwei Gruppen aufteilen: neue und bereits eingefügte. Sie könnten dann 'InsertAll' und' UpdateAll' jeweils aufrufen. –

+0

thx Sie. Werde es überprüfen und meinen Code ändern :) –