You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MAUI SQLite-net datetime列默认值失效问题技术求助

MAUI SQLite-net DateTime列默认值失效问题

问题现象

  • 建表时给user_created字段设置DATETIME类型和默认值(CURRENT_TIMESTAMP或datetime('now','localtime')),但插入数据后该字段始终显示{1/1/0001 12:00:00 am}
  • 两种插入方式都没效果:
    1. 原生SQL插入:db.Execute("insert into User default values");
    2. ORM方法插入:db.Insert(user);
  • 手动给user_created赋值后调用db.Update()能正常更新时间,但用原生SQL更新(比如set user_created=CURRENT_TIMESTAMP)同样不生效
  • 测试环境:Windows 11 + Android模拟器

原因分析

  1. ORM字段覆盖:使用db.Insert(user)时,如果实体的user_created属性是默认的DateTime.MinValue,SQLite-net会生成包含该字段的插入语句,显式插入默认值,直接跳过数据库的默认值约束。
  2. 类型转换问题:SQLite的CURRENT_TIMESTAMP返回ISO8601格式字符串,SQLite-net默认的DateTime解析逻辑可能无法正确识别,导致解析失败返回DateTime.MinValue。

解决方案

1. 给实体属性加[Default]特性

在实体类的user_created属性上添加特性,让ORM在属性为默认值时跳过该字段,触发数据库默认值:

public class User
{
    [PrimaryKey, AutoIncrement]
    public int user_id { get; set; }
    
    [Default(typeof(DateTime), "CURRENT_TIMESTAMP")]
    public DateTime user_created { get; set; }
    
    // 其他字段...
}

插入时不用给user_created赋值,ORM会自动生成不含该字段的SQL,让数据库用默认值填充。

2. 配置DateTime解析规则

调整SQLite-net的DateTime处理模式,确保能正确解析SQLite返回的时间字符串:

var db = new SQLiteConnection(dbPath, SQLiteOpenFlags.ReadWrite | SQLiteOpenFlags.Create);
// 设置DateTime处理为UTC模式,适配SQLite的时间格式
db.DateTimeKind = DateTimeKind.Utc;

3. 原生SQL操作后重新查询

如果必须用原生SQL插入/更新,操作后重新查询实体,获取数据库中实际存储的时间:

// 插入后查询最新数据
db.Execute("insert into User default values");
var latestUser = db.Table<User>().OrderByDescending(u => u.user_id).First();

// 更新后重新查询目标实体
db.Execute("update User set user_created=CURRENT_TIMESTAMP where user_id=1");
var updatedUser = db.Table<User>().First(u => u.user_id == 1);

4. 改用TEXT类型存储时间(备选)

把数据库字段类型改成TEXT,默认值保留CURRENT_TIMESTAMP,SQLite存储的字符串时间能被SQLite-net稳定解析:

CREATE TABLE User (
    user_id INTEGER PRIMARY KEY AUTOINCREMENT,
    user_created TEXT DEFAULT CURRENT_TIMESTAMP,
    -- 其他字段...
);

内容的提问来源于stack exchange,提问作者WWW

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 10:17:42