Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/212.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java SQLite按日期删除行_Java_Android_Sql_Sqlite_Android Database - Fatal编程技术网

Java SQLite按日期删除行

Java SQLite按日期删除行,java,android,sql,sqlite,android-database,Java,Android,Sql,Sqlite,Android Database,我一直在寻找,但我仍然不明白这是怎么回事 我知道SQLite不存储日期类型的值,我们必须将它们格式化为文本。我已经这么做了,但我的问题是如何按日期删除它们 因为如果我从列_DATE>='09-05-2017'的表中删除*,我将比较字符串而不是日期,所以我猜比较是不对的 我见过人们做这种比较,即使它是文本类型。我没有任何意义。如果您使用规范文本格式并使用正确的语法,例如 DELETE FROM TABLE WHERE COLUMN_DATE >= '2017-05-09' 如果您使用规范文

我一直在寻找,但我仍然不明白这是怎么回事

我知道SQLite不存储日期类型的值,我们必须将它们格式化为文本。我已经这么做了,但我的问题是如何按日期删除它们

因为如果我从列_DATE>='09-05-2017'的表中删除*,我将比较字符串而不是日期,所以我猜比较是不对的


我见过人们做这种比较,即使它是文本类型。我没有任何意义。

如果您使用规范文本格式并使用正确的语法,例如

DELETE FROM TABLE WHERE COLUMN_DATE >= '2017-05-09'

如果您使用规范文本格式并使用正确的语法,例如

DELETE FROM TABLE WHERE COLUMN_DATE >= '2017-05-09'

在SQLite端日期比较/算法方面,一个更高效、更简单的方法是在SQLite中将日期存储为
INT
s

Android中的日期实际上只是一个从纪元开始的毫秒容器(从1970年1月1日午夜UTC开始的毫秒),与时区无关

SQLite中的
INT
是根据列中的值自动选择的1、2、4、8字节数据类型

在数据库中存储数据时,要将Java
Date
转换为SQLite
INT
值,请使用以下方法:

要从SQLite检索日期,请使用
Cursor
getLong()
方法并将其传递给构造函数:

SQLiteDatabase db = ...;
Cursor c = db.query(..);
long sqlDate = c.getLong(...);
Date javaDate = new Date(sqlDate);

在SQLite端日期比较/算法方面,一个更高效、更简单的方法是在SQLite中将日期存储为
INT
s

Android中的日期实际上只是一个从纪元开始的毫秒容器(从1970年1月1日午夜UTC开始的毫秒),与时区无关

SQLite中的
INT
是根据列中的值自动选择的1、2、4、8字节数据类型

在数据库中存储数据时,要将Java
Date
转换为SQLite
INT
值,请使用以下方法:

要从SQLite检索日期,请使用
Cursor
getLong()
方法并将其传递给构造函数:

SQLiteDatabase db = ...;
Cursor c = db.query(..);
long sqlDate = c.getLong(...);
Date javaDate = new Date(sqlDate);
tl;博士
  • 以标准方式将仅日期值存储为字符串:YYYY-MM-DD
  • 特别是使用java.time类中的ISO 8601字符串进行查询
例如:

LocalDate ld = LocalDate.of( 2017 , Month.JANUARY , 23 ) ; // Or `LocalDate.parse`, or `LocalDate.now()`.
String sql = "DELETE * FROM tbl WHERE col >= '" + ld.toString() + "' ;" ;
细节 请记住,这只是将文本写入文件的一个进步。因此,如果您需要复杂的日期时间支持,您应该切换到更复杂的数据库

正如您在问题中提到的,SQLite缺少适当的数据类型。对于存储日期-时间类型,:(a)字符串,(b)表示朱利安日数的实数(我不建议这样做),以及(c)整数,用于存储自1970年第一个UTC时刻的历元引用以来的秒数,如中所示(尽管您不应使用此处显示的
date
类)

您似乎只跟踪日期值,而不跟踪一天中的某个时间。所以我会使用文本:YYYY-MM-DD

java中的java.time类型在解析/生成日期时间值时默认使用标准格式。Java中的date-only类是,缺少一天中的时间和时区

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.
标准ISO8601格式的优点是字母顺序恰好也是时间顺序

因此,您可以使用大于/小于逻辑进行基于文本的比较

String sql = "DELETE * FROM tbl WHERE col >= '" + ld.toString() + "' ;" ;
与其他两种方法相比的另一大优势是:

  • 试图用分数实数来表示日期时间是很麻烦的
  • 存储来自epoch的计数会使调试和故障排除变得困难,因为人类无法轻松读取数据的含义

关于java.time 该框架内置于Java8及更高版本中。这些类取代了麻烦的旧日期时间类,例如,&

该项目现已启动,建议迁移到类

要了解更多信息,请参阅。并搜索堆栈溢出以获得许多示例和解释。规格是

您可以直接与数据库交换java.time对象。使用兼容的或更高版本。不需要字符串,也不需要
java.sql.*

从哪里获得java.time类

  • ,及以后
    • 内置的
    • 标准JavaAPI的一部分,带有捆绑实现
    • Java9添加了一些次要功能和修复
    • 大部分java.time功能都在中向后移植到Java6和Java7
    • 更高版本的Android捆绑包实现了java.time类
    • 对于早期的Android(tl;dr
      • 以标准方式将仅日期值存储为字符串:YYYY-MM-DD
      • 特别是使用java.time类中的ISO 8601字符串进行查询
      例如:

      LocalDate ld = LocalDate.of( 2017 , Month.JANUARY , 23 ) ; // Or `LocalDate.parse`, or `LocalDate.now()`.
      String sql = "DELETE * FROM tbl WHERE col >= '" + ld.toString() + "' ;" ;
      
      细节 请记住,这只是将文本写入文件的一个进步。因此,如果您需要复杂的日期-时间支持,您应该切换到更复杂的数据库

      正如您在问题中所提到的,SQLite缺少适当的数据类型。对于存储日期时间类型,请使用:(a)字符串,(b)表示朱利安日数的实数(我不建议这样做),以及(c)整数,用于存储UTC中1970年第一时刻的历元引用以来的秒数,如中所示(尽管您不应该使用此处显示的
      Date
      类)

      您似乎只跟踪日期值,而没有一天中的时间。因此,我将使用文本:YYYY-MM-DD

      java中的java.time类型在解析/生成日期时间值时默认使用标准格式

      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.
      
      标准ISO8601格式的优点是字母顺序恰好也是时间顺序

      因此,您可以使用大于/小于逻辑进行基于文本的比较

      String sql = "DELETE * FROM tbl WHERE col >= '" + ld.toString() + "' ;" ;
      
      与其他两种方法相比的另一大优势是:

      • 试图代表dat