You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在Android SQLite的Contract类中定义当前日期或时间?

在Android SQLite Contract类中处理日期/日期时间的正确姿势

嘿,我明白你困惑的点了——其实你可能把列名定义插入当前日期值这两个步骤搞混啦!Contract类里的常量只是用来定义数据库表的列名称,而不是直接存放当前日期的地方。下面一步步给你讲清楚:

第一步:先在Contract里定义列名

首先,COLUMN_CURRENTDATE就是一个普通的字符串常量,用来表示这一列的名称,比如我们可以命名为"current_datetime"

public class ParkContract { 
    private ParkContract() {} 

    public static final class RegisterEntry implements BaseColumns { 
        public static final String TABLE_NAME = "general";
        public static final String _ID = BaseColumns._ID;
        // 定义日期时间列的名称
        public static final String COLUMN_CURRENTDATE = "current_datetime";
    } 
}

第二步:创建表时指定列的类型

接下来在创建表的SQL语句里,你需要给这个列指定合适的类型。SQLite里存储日期时间通常有两种常用方式:

  • TEXT类型:直接存储可读的日期字符串(比如"2024-05-20 14:30:00"),适合需要直接读取展示的场景
  • INTEGER类型:存储Unix时间戳(毫秒数),适合需要进行日期计算的场景

比如用TEXT类型的创建语句示例:

private static final String SQL_CREATE_GENERAL_TABLE =
    "CREATE TABLE " + RegisterEntry.TABLE_NAME + " (" +
    RegisterEntry._ID + " INTEGER PRIMARY KEY AUTOINCREMENT," +
    RegisterEntry.COLUMN_CURRENTDATE + " TEXT NOT NULL);"; // 指定TEXT类型存储日期字符串

第三步:插入数据时获取当前日期时间

现在要插入当前日期时间,有两种实用方法:

方法1:用SQLite内置函数自动生成

直接在插入语句里用SQLite的datetime('now')函数,它会自动生成当前UTC时间的字符串;如果需要本地时间,就用datetime('now', 'localtime')

// 注意:这种方式要调用execSQL,因为insert方法会把函数字符串当成普通值
db.execSQL("INSERT INTO " + RegisterEntry.TABLE_NAME + " (" + RegisterEntry.COLUMN_CURRENTDATE + ") VALUES (datetime('now', 'localtime'));");

方法2:在Java代码中生成日期字符串

用Java的LocalDateTime(Android 8.0+推荐)或者SimpleDateFormat生成格式化的日期字符串,再插入到数据库:

// Android API 26+ 推荐的LocalDateTime方式
String currentDatetime = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
ContentValues values = new ContentValues();
values.put(RegisterEntry.COLUMN_CURRENTDATE, currentDatetime);
db.insert(RegisterEntry.TABLE_NAME, null, values);

// 兼容低版本的SimpleDateFormat方式
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.getDefault());
String currentDatetime = sdf.format(new Date());
ContentValues values = new ContentValues();
values.put(RegisterEntry.COLUMN_CURRENTDATE, currentDatetime);
db.insert(RegisterEntry.TABLE_NAME, null, values);

小提示

如果选择用时间戳存储(INTEGER类型),插入时可以用System.currentTimeMillis()获取当前毫秒数,查询后再转换成日期字符串展示,这种方式做日期比较(比如筛选最近7天的数据)会更高效哦!

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

火山引擎 最新活动