[英]SQLite delete rows by date
我一直在搜索,但我仍然不明白它是如何工作的。
我知道SQLite不存储Date类型的值,我们必须将它们格式化为TEXT。 我已经做到了,但是我的问题是如何按日期删除它们?
因为如果我DELETE * FROM TABLE WHERE COLUMN_DATE >= '09-05-2017'
,我将比较字符串而不是日期,所以我猜比较是不正确的。
我已经看到人们进行这种类型的比较,即使它是TEXT类型。 我对我没有任何意义。
如果您使用规范文本格式并使用正确的语法(例如,
DELETE FROM TABLE WHERE COLUMN_DATE >= '2017-05-09'
就SQLite边日期比较/算术而言,一种更有效,更简单的方法是在SQLite中将日期存储为INT
。
自从Epoch(自1970年1月1日午夜UTC以来的毫秒数)以来,Android中的Date
实际上只是一个毫秒数的容器,与时区无关。
SQLite中的INT
是根据列中的值自动选择的1、2、4、8字节数据类型。
为了在将数据存储在DB中时将Java Date
转换为SQLite INT
值,请使用getTime()
方法:
Date javaDate = ...;
long sqlDate = date.getTime();
要从SQLite检索日期,请使用Cursor
的getLong()
方法并将其传递给Date(long)
构造函数:
SQLiteDatabase db = ...;
Cursor c = db.query(..);
long sqlDate = c.getLong(...);
Date javaDate = new Date(sqlDate);
例:
LocalDate ld = LocalDate.of( 2017 , Month.JANUARY , 23 ) ; // Or `LocalDate.parse`, or `LocalDate.now()`.
String sql = "DELETE * FROM tbl WHERE col >= '" + ld.toString() + "' ;" ;
请记住, SQLite从来都不是一个重型数据库 ,只是将文本写入文件的一个步骤。 因此,如果您需要复杂的日期时间支持,则应切换到更复杂的数据库。
正如您在课题中提到的那样,SQLite缺少适当的数据类型。 为了存储日期时间类型, 文档提出了三种路由 :(a) ISO 8601字符串,(b)代表儒略日数字的实数(我不建议这样做),以及(c)用于存储自如Ubakumov的Answer中所示,以UTC表示1970年第一时刻的时代参考(尽管您不应该使用此处显示的Date
类)。
您似乎正在跟踪仅日期的值,而没有一天的时间。 因此,我将对文本使用ISO 8601 :YYYY-MM-DD。
解析/生成日期时间值时,Java中的java.time类型默认使用标准ISO 8601格式。 Java中的仅日期类是LocalDate
,缺少日期和时区。
ZoneId z = ZoneId.of( "Africa/Tunis" ) ;
LocalDate today = LocalDate.now( z ) ;
指定日期。
LocalDate ld = LocalDate.parse( "2017-09-05" ) ; // Standard ISO 8601 format for input: YYYY-MM-DD.
标准ISO 8601格式的优点是字母顺序也按时间顺序排列。
因此,您可以使用大于/小于逻辑进行基于文本的比较。
String sql = "DELETE * FROM tbl WHERE col >= '" + ld.toString() + "' ;" ;
与其他两种方法相比的另一大优势:
java.time框架内置于Java 8及更高版本中。 这些类取代了麻烦的旧的旧式日期时间类,例如java.util.Date
, Calendar
和SimpleDateFormat
。
现在处于维护模式的Joda-Time项目建议迁移到java.time类。
要了解更多信息,请参见Oracle教程 。 并在Stack Overflow中搜索许多示例和说明。 规格为JSR 310 。
您可以直接与数据库交换java.time对象。 使用与JDBC 4.2或更高版本兼容的JDBC驱动程序 。 不需要字符串,不需要java.sql.*
类。
在哪里获取java.time类?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.