Ich verwende SQLite.NET mit Erweiterungen in einer UWP-App, um ein Objekt zu speichern, das ein DateTime-Feld enthält, und ich bekomme merkwürdige Ergebnisse. Es scheint, dass Daten mit ein paar Stunden von dem gespeichert werden, was sie sein sollten, manchmal den Tag der DateTime auf den nächsten Tag schiebend.Problem mit SQLite und DateTime Genauigkeit
Ich bin Speichern einer POCO-Klasse Rekord genannt, die die Situation Objekt enthält, das wie dieses
public class Situation
{
[PrimaryKey, AutoIncrement]
public int SituationId { get; set; }
public DateTime DateTime { get; set; }
public string Description { get; set; }
}
The Record Klasse sieht, die Situation enthält SQLite gespeichert wird unter Verwendung durch ein Repository-Muster wie so (ich habe nur die relevanten Methoden enthalten):
internal class Repository<T> : IRepository<T> where T : class
{
private SQLiteAsyncConnection asyncConn;
public Repository(SQLiteAsyncConnection conn)
{
asyncConn = conn;
}
public async Task<T> GetByIdAsync(int id)
{
var entity = await asyncConn.GetWithChildrenAsync<T>(id);
return entity;
}
public async Task InsertOrUpdateAsync(T entity)
{
await asyncConn.InsertOrReplaceWithChildrenAsync(entity);
}
}
Schließlich erhalte ich eine AsyncConnection für das Repository eine Connectionmanager-Klasse:
public class ConnectionManager
{
public static readonly string FileName = "db.sqlite";
private static string path = Path.Combine(Windows.Storage.ApplicationData.Current.LocalFolder.Path, "db.sqlite");
public static SQLiteAsyncConnection GetAsyncConnection()
{
var connString = new SQLiteConnectionString(path, storeDateTimeAsTicks: true);
var connWithLock = new SQLiteConnectionWithLock(new SQLitePlatformWinRT(), connString);
return new SQLiteAsyncConnection(() => connWithLock);
}
}
Diese AsyncConnection speichert DateTimes als Ticks, von denen ich vermute, dass sie die Ursache des Problems sind.
In einem Fall unmittelbar vor dem Record-Objekt gespeichert wird Repository.InsertOrUpdateAsync verwenden, hat die Situation.DateTime folgende Werte:
Datetime = {2016.07.01 12.59.59}
Ticks = 636029747990010000
jedoch die Datensätze mit Repository.GetByIdAsync ziehen, sind Datetime-Werte wie folgt:
Datetime = {2016.07.01 04.59.59}
Ticks = 636029891990010000
Wie Sie sehen können, etwas im Busch ist mit der Art und Weise SQLite ist die Datetime zu speichern. Das Feld Ticks hat sich geändert, was zu einem neuen Datum geführt hat. Ich bin mir nicht 100% sicher, warum das so ist. Ich weiß, DateTime kann Probleme mit Genauigkeit haben, aber wenn DateTimes als Ticks gespeichert sind, sollte das Ticks-Feld nicht übereinstimmen? Warum werden sie verändert?
Angenommen, ich muss DateTimes als Ticks speichern, wie kann ich dieses Problem beheben? Ich denke nur daran, die DateTime-Stunde auf 12 zu setzen, sodass sie sich um mehrere Stunden erhöhen oder verringern lässt, ohne den Tag zu ändern, aber das ist offensichtlich nicht ideal.
Jede Hilfe wäre willkommen. :)
Was ist der Spaltendatentyp in der Tabelle? –
Haben Sie versucht, DateTimeOffset zu verwenden?Das Problem in Ihrem Fall könnte die Tatsache sein, dass DateTime keine Zeitzoneninformation speichert. –
Es sieht total wie ein Zeitzonenproblem aus. Verwenden Sie UTC-Daten, um Zeitzonenprobleme beim Speichern/Lesen von Daten zu vermeiden. – redent84