Android从sqlite db获取项目,其日期为今天或之前的

时间:2016-02-02 23:14:01

标签: android sqlite date

我正在努力在SQLite3中实现日期(对于android)。根据文档(https://www.sqlite.org/datatype3.htmlhttp://www.sqlite.org/lang_datefunc.html),SQLite没有具体的日期和时间数据类型,因此它可以存储为TEXT或INTEGER。我试过了两个,但他们给出了同样的错误结果。在互联网上阅读 lot 并尝试我能想到的一切后,我作为最后的手段来到这里。

所以,现在针对这个问题。这个想法实际上非常简单。我有一个包含项目的表,有一个日期列。现在我想要选择此数据库中具有今天或之前(即今天或过去)日期的所有项目。在我目前的实现中,我将日期存储为整数,因为大多数人似乎都认为这是可行的方法。

以下是插入项目的(简化)代码。

Calendar calendar = GregorianCalendar.getInstance();
calendar.set(Calendar.HOUR_OF_DAY, 0); // Might not be necessary
calendar.add(Calendar.DAY_OF_YEAR, 4); // Today plus 4 days

SQLiteDatabase db = dbOpenHelper.getWritableDatabase();
ContentValues values = new ContentValues();
values.put(COLUMN_DATE, calendar.getTimeInMillis()); // Today as integer/long
long id = db.insert(TABLE_ITEMS, null, values); // Add to db

接下来我想选择日期等于或低于今天的项目:

SQLiteDatabase db = dbOpenHelper.getReadableDatabase();
String[] columns = new String[]{COLUMN_ID, COLUMN_TEXT, COLUMN_DATE};
String[] selectArg = new String[]{"date('now')"};
Cursor cItems = db.query(TABLE_ITEMS, columns, COLUMN_DATE + "<= ?", selectArg, null, null, null);
//Cursor cItems = db.query(TABLE_ITEMS, columns, "strftime('%Y-%m-%d'," + COLUMN_DATE + ")" + select, selectArg, null, null, null);
//Cursor cItems = db.query(TABLE_ITEMS, columns, "date(" + COLUMN_DATE + ")" + select, selectArg, null, null, null);

现在选择所有行,以及将来有日期的行。谁能告诉我我需要做些什么?

提前致谢!

修改

我发现sqlite以秒为单位存储日期整数(这是正确的吗?)。那么这意味着我在数据库中放入的值应为Math.round(calendar.getTimeInMillis()/1000,以便在几秒钟内得到它?但是它会更少,因为以毫秒为单位的日期应始终大于以秒为单位的日期。无论如何,我试过了,但它也不起作用。

2 个答案:

答案 0 :(得分:2)

感谢CL的见解。给了我,我修正了一些琐碎的错误。

回顾一下SQLite文档,我发现有两种方法可以存储没有时间的日期。朱利安日期号码或日期字符串YYYY-MM-DD。没有现成的功能来获取java / android中的Julian日期号,因此我选择再次返回字符串格式。

我刚才想到的第二个错误是selectArgs被认为是文本,因此将date('now', 'localtime')放在那里是行不通的。

以下是可行的最终脚本。

Calendar calendar = GregorianCalendar.getInstance();
calendar.set(Calendar.HOUR_OF_DAY, 0); // Might not be necessary
calendar.add(Calendar.DAY_OF_YEAR, 4); // Today plus 4 days

SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
ContentValues values = new ContentValues();
values.put(COLUMN_DATE, dateFormat.format(calendar.getTime())); // Date as string


SQLiteDatabase db = dbOpenHelper.getWritableDatabase();
long id = db.insert(TABLE_ITEMS, null, values); // Add to db

要获取数据:

SQLiteDatabase db = dbOpenHelper.getReadableDatabase();
String[] columns = new String[]{COLUMN_ID, COLUMN_TEXT, COLUMN_DATE};
String[] selectArg = new String[]{};
Cursor cItems = db.query(TABLE_ITEMS, columns, COLUMN_DATE + "<= date('now', 'localtime')", selectArg, null, null, null);
CL,非常感谢你的帮助!最后它很简单......

答案 1 :(得分:0)

date()strftime('%Y-%m-%d')都不会以您的格式返回日期。

要将日期转换为秒格式,您必须使用strftime('%s', ...),并将结果字符串转换为数字。