如何在SQLite数据库中添加日期

23

我有一个SQLite数据库

    private static final String DB_PROCESS_CREATE = "create table "
        + DB_TABLE_PROCESS + "(" + PROCESS_ID
        + " integer primary key autoincrement, "
        + PROCESS_DATE + " date);";

我创建它 db.execSQL(DB_PROCESS_CREATE);

如何在该数据库中添加日期值? 我尝试过:

String date = new SimpleDateFormat("yyyy.MM.dd").format(Calendar
.getInstance().getTime());
ContentValues cv = new ContentValues();
cv.put(db.PROCESS_DATE,Date.valueOf(date));
db.mDB.insert(db.DB_TABLE_PROCESS, null, cv));

但是我遇到了 错误 :

"The method put(String, String) in the type ContentValues is not applicable for the arguments (String, Date)".

3个回答

53

现在,当您想要将日期插入到数据库时,可以使用此代码。

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
String date = sdf.format(new Date());

在数据库中插入字符串'date'

SQLite中日期格式应该是以下格式:

YYYY-MM-DD
YYYY-MM-DD HH:MM
YYYY-MM-DD HH:MM:SS
YYYY-MM-DD HH:MM:SS.SSS
YYYY-MM-DDTHH:MM
YYYY-MM-DDTHH:MM:SS
YYYY-MM-DDTHH:MM:SS.SSS
HH:MM
HH:MM:SS
HH:MM:SS.SSS
now
DDDDDDDDDD 

更多详情,请查看:http://www.sqlite.org/lang_datefunc.html


我尝试过了,但在这种情况下按日期排序是不可能的。 - Kostya Khuta
@KostyaKhuta 试试这个,应该可以。让类型PROCESS_DATE为日期。 - Homam
构造函数 Date() 未定义。我需要传递什么给构造函数? - Kostya Khuta
按下Ctrl+Shift+O可以自动导入缺失的包 或者 导入java.util.Date; - Homam
我的笔误,在我的课堂上我导入了import java.sql.Date=)。 - Kostya Khuta
显示剩余2条评论

14

您无法直接在SQLite中存储日期。例如,您可以将其存储为整数值:

ContentValues cv = new ContentValues();
cv.put(db.PROCESS_DATE, new Date().getTime());
db.mDB.insert(db.DB_TABLE_PROCESS, null, cv));

在这种情况下,您的日期字段必须声明为整数:

private static final String DB_PROCESS_CREATE = "create table "
        + DB_TABLE_PROCESS + "(" + PROCESS_ID
        + " integer primary key autoincrement, "
        + PROCESS_DATE + " integer);";

根据 SQLite 文档: SQLite 没有专门用于存储日期和/或时间的存储类别。相反,SQLite 的内置日期和时间函数可以将日期和时间存储为 TEXT、REAL 或 INTEGER 值:

  1. TEXT 作为 ISO8601 字符串 ("YYYY-MM-DD HH:MM:SS.SSS")。
  2. REAL 作为朱利安日号码,即格林威治时间在公历前提下的公元前4714年11月24日中午以来的天数。
  3. INTEGER 作为 Unix 时间,即从1970-01-01 00:00:00 UTC开始计算的秒数。 应用程序可以选择使用任何这些格式存储日期和时间,并可以使用内置的日期和时间函数在这些格式之间自由转换。

请参见http://www.sqlite.org/datatype3.html


2

将日期存入数据库的最佳方法是使用其长整型值。我试着按照你所做的方式去做,结果出现了类似的错误。请不要使用字符串而是使用数字作为值。它可以接受长整型值,我相信它是某种毫秒值。当你从数据库中取出时,可以重新转换回来。


只要不会有成千上万个日期,你就可以提取所有日期并循环遍历它们。 - Martin Estes
只要您不添加当前日期之前的日期,它就不必这样做。如果您不会有重叠的日期,请使用TreeSet。否则,您需要覆盖compareTo以适应年、月和日。我建议使用前两种方法之一。 - Martin Estes
嗯...但我可以按日期(长值)排序,然后将其转换为日期格式。 - Kostya Khuta
可以的。日期值保留了精确到秒的时间,因此除非您以某种方式同时获取两个日期,否则它们始终会有所不同。 - Martin Estes
按日期排序就像按长整型值排序一样简单。长整型值表示从1990年1月1日开始经过的毫秒数。如果您想要具有当前日期的字段,只需查询获取长整型值大于或等于2013年5月24日00:00且小于2013年5月25日00:00的行即可。 - Sam
显示剩余5条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接