java– 从两个日期android之间的Sqllite DB中检索数据

java– 从两个日期android之间的Sqllite DB中检索数据,第1张

概述我检索两个日期之间的数据一些如何获得正确的结果和一些如何输出空列表视图当我选择日期与月份它正常工作但当我选择日期超过一个月它输出空列表视图下面是我的代码这里我在DB类中声明变量publicstaticfinalStringEX_RowID="_id";publicstaticfinalStringEX_Cattype

我检索两个日期之间的数据一些如何获得正确的结果和一些如何输出空列表视图当我选择日期与月份它正常工作但当我选择日期超过一个月它输出空列表视图下面是我的代码

这里我在DB类中声明变量

public static final String EX_RowID = "_ID";public static final String EX_Cattype = "Ecattype";public static final String EX_Date = "Ecdate";public static final String EX_Price = "Ecprice";public static final String EX_Type = "itype";

创建表语句

    public voID onCreate(sqliteDatabase db) {        // Todo auto-generated method stub        db.execsql("CREATE table " + Food_table +"(" +                EX_RowID + " INTEGER PRIMARY KEY autoINCREMENT, " +                EX_Cattype + " TEXT NOT NulL, " +                EX_Date + " TEXT NOT NulL," +                EX_Price + " INTEGER NOT NulL," +                EX_Type + " TEXT NOT NulL UNIQUE );"                );    }

输入数据方法

 public long ExEntry(String Ecatgtype, String Edate, String Eprice, String Eitype) {// Todo auto-generated method stubContentValues cv = new ContentValues();cv.put(EX_Cattype, Ecatgtype);cv.put(EX_Date, Edate );cv.put(EX_Price, Eprice);cv.put(EX_Type, Eitype);return ourdatabase.insertOrThrow(Food_table, null, cv); }

在这里我访问ExEntry方法

ExMgDB Expentry = new ExMgDB(ADD_EX.this);    Expentry.open();    Expentry.ExEntry(cate, date, price, itype);    Expentry.close();

在这里,我面临着这两个日期变量之间的问题

 public Cursor CstmRpot(String fd, String td) {// Todo auto-generated method stubString[] columns = new String[] {EX_RowID,EX_Cattype, EX_Date, EX_Price, EX_Type };Cursor c= ourdatabase.query(Food_table, columns, EX_Date  + " BETWEEN '" + fd + "'   AND '" + td + "'" , null, null, null, null);if (c != null) {       c.movetoFirst();      }return c;}

我可以像下面一样访问它

 CustemRpt dbcs = new CustemRpt();    Cursor cursor = CstDB.CstmRpot(frmdate,tondate);

解决方法:

有两个主要的解决方案.所有解决方案都有共同之处,即包含日期的列必须以某种方式进行排序.如果此订单被销毁,则您的数据已损坏且您的查询无法返回预期结果!

1.将您的日期保存为数据库中的INTEGER,并使用方法将日期映射到数字:

一种可能的方法是使用Date.getTime()将日期映射到数字,但还有许多其他.重要的是

>相等的日期获得相同的数字和
>在另一个日期之后的日期获得更大的数字.

这样订购肯定是正确的.
要使用`Java.util.Date.getTime()实现此目的,如果只想存储日期,则只需将时间设置为0:00:00:000.

例如:

"CREATE table " + Food_table +"(" +    EX_RowID + "INTEGER PRIMARY KEY autoINCREMENT, " +    EX_Cattype + " TEXT NOT NulL, " +    EX_Date + " INTEGER NOT NulL," +    EX_Price + " INTEGER NOT NulL," +    EX_Type + " TEXT NOT NulL UNIQUE );"private static String dateOnly(java.util.Date d) {    Calendar cal = Calendar.getInstance(); // locale-specific    cal.setTime(d);    cal.set(Calendar.HOUR_OF_DAY, 0);    cal.set(Calendar.MINUTE, 0);    cal.set(Calendar.SECOND, 0);    cal.set(Calendar.MILliSECOND, 0);    return Long.toString(cal.getTimeInMillis());}public Cursor CstmRpot(java.util.Date fd, java.util.Date td) {    // Todo auto-generated method stub    String[] columns = new String[]{EX_RowID,EX_Cattype, EX_Date, EX_Price, EX_Type };    Cursor c= ourdatabase.query(Food_table, columns, EX_Date + " > " + dateOnly (fd) + " AND " + EX_Date + " < " + dateOnly(td), null, null, null, null);    if (c != null) {        c.movetoFirst();    }    return c;}

如果不使用不同的时区,可以优化dateOnly(java.util.Date d).
当然你也可以使用JODA时间.

2.将您的日期保存为TEXT

如果选择此方法,则比较日期列的查询将会慢一些,但数据库中的条目是人类可读的,而方法1则不然.
TEXT列默认排序为BINARY,这意味着memcmp()用于比较值并确定哪个值更大或值是否相等. (记住x BETWEEN a AND b表示x< = a AND x> = b.)
您可以使用此功能memcmp()检查memcmp()的工作.

为确保您获得正确的结果,您必须确保以下内容:

>数据库中的所有日期值必须具有相同的文本长度.
>数据库中的所有日期值必须采用相同的格式.较大的日期部分(年份)必须在较小的日期部分(月份)之前.
>查询中日期值的所有参数也必须遵循这些规则.

可能的日期格式可能如下所示:yyyy-MM-dd(例如2014-02-04或2000-12-24).

建议

>使用android.widget.DatePicker代替Edittext获取日期作为输入.
>切勿在查询中直接使用从用户输入中获得的任何文本,而应在之前验证它们(请参阅sql-injection).
>阅读一些关于如何比较字符串的文章.

总结

以上是内存溢出为你收集整理的java – 从两个日期android之间的Sqllite DB中检索数据全部内容,希望文章能够帮你解决java – 从两个日期android之间的Sqllite DB中检索数据所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1099117.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-28
下一篇 2022-05-28

发表评论

登录后才能评论

评论列表(0条)

保存