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()}**
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 –
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. –
thx Sie. Werde es überprüfen und meinen Code ändern :) –