如何在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




