簡體   English   中英

在SQLite.Net中存儲DateTimeOffset

[英]Store DateTimeOffset in SQLite.Net

在WinRT(Windows 8.1 Store App)項目中,我使用SQLite.Net-PCL和SQLiteNetExtensions NuGet包將數據存儲在本地SQLite數據庫文件中。

我的一些數據模型(也稱為表)包含DateTimeOffset類型的屬性。 目的是在不丟失偏移信息的情況下存儲這些信息 (原因是用戶可以在指定日期/時間時輸入時區信息,並且此信息必須存儲在數據庫中。)

我知道可以在創建SQLiteConnection時設置storeDateTimeAsTicks參數,將其設置為false強制所有DateTime屬性以ISO格式存儲為文本 - 但是,這對DateTimeOffset屬性沒有影響,因為它們總是自動轉換到UTC並存儲為代表刻度的數字。

我可以想到以下4種方法:

  • 手動將DateTimeOffset轉換為string屬性並存儲這些,或
  • 提取DateTime和偏移(如TimeSpan日期型)的部件DateTimeOffset ,並且這些存儲在兩個單獨的列,

=>但對於這兩種方法,我需要向數據模型添加其他屬性,使用[Ignore]屬性標記原始DateTimeOffset屬性,並處理手動轉換(在兩個方向上) - 因為我需要應用此對很多不同的數據模型類來說,維護起來似乎太難了。

  • 存儲DateTimeTimeSpan (偏移)的部分DateTimeOffset在一個單獨的表中的兩列,並維持到單獨的表引用

=>但是在這種情況下我需要定義一個自定義數據類型(為了指定應該如何存儲DateTimeTimeSpan部分),並且不能使用默認的.NET DateTimeOffset類型

  • 使用SQLiteNetExtensions的TextBlob屬性以某種方式將DateTimeOffset序列化為單個文本列

=>但這感覺有點hacky,我需要確保只有SQLiteNetExtensions的擴展方法用於數據庫插入/更新,並且我仍然需要在所有數據模型類上增加一個string屬性...

所以,我的問題是:我是否缺少一個更為直接,明顯的解決方案?

由於沒有人提出可能的解決方案,但問題仍然引起了一些關注,我決定報告我是如何解決問題的:

方法#1:

引發原始問題的場景包括一個由以下內容組成的移動應用程序

  • API數據模型類(用於序列化到/從JSON到上傳/從后端REST服務下載),
  • DB數據模型類(代表SQLite表)和
  • 用於MVVM樣式表示層的各種ViewModel類

API模型和數據庫模型幾乎相同(除了JSON序列化和SQLite OR映射所需的屬性),唯一的結構差異是表示日期/時間的屬性在API類中是string類型,在DB類中是DateTimeOffset 從中下載數據之后,在將數據上傳到后端之前,使用Automapper將API和DB模型相互轉換。

我只是從Automapper配置中刪除了stringDateTimeOffset轉換,並修改了DB數據模型類,以便DateTimeOffset值表示為string ,這意味着它們在SQLite中存儲為格式化文本(幸運的是,沒有日期/時間計算需要DB層)。 由於從后端接收的JSON對象包含時區信息,因此我可以簡單地將這些值傳遞給數據庫模型,從而確保數據庫表始終包含日期/時間作為完全格式化的日期時間字符串,包括時區偏移量。

從DB數據模型創建ViewModel類時,現在會發生從stringDateTimeOffset轉換。 顯然,這種情況比以前更頻繁(將API模型轉換為數據庫模型時)會產生一些開銷,但我可以忍受這種情況,因為我不再需要擔心SQLite數據類型問題了。

方法#2:

由於方法#1可能不適用於所有方案,我提出了一個替代解決方案,該解決方案基於原始問題中提出的4個潛在解決方案中的第一個,但減少了手動工作:

我創建了一個可以分配給SQLite數據模型類中的DateTimeOffset屬性的自定義屬性[DateTimeOffsetSerialize] ,以及一個在構建完成后反編譯程序集的postbuild任務,並掃描程序集中的所有類以查找那些標記的屬性。 對於這些標記屬性中的每一個,將自動創建包含原始屬性的序列化值的string類型的重復屬性,並且此新創建的string屬性將用作SQLite表列(原始DateTimeOffset屬性將使用[Ignore]自動標記[Ignore]屬性)。

該解決方案以NuGet包的形式提供 ,並且已在GitHub上開源 (GitHub頁面還包含詳細的使用說明)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM