繁体   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