android:SQLite 查询与条件之间的问题
Posted
技术标签:
【中文标题】android:SQLite 查询与条件之间的问题【英文标题】:android: SQLite query with between condition problem 【发布时间】:2011-09-28 16:31:38 【问题描述】:我有一个这样的表:
db.execSQL("CREATE TABLE TBL_REMINDERS (" //
+ "FLD_YEAR INTEGER, " //
+ "FLD_MON INTEGER, " //
+ "FLD_DATE INTEGER, " //
+ "FLD_HOUR INTEGER, " //
+ "FLD_MIN INTEGER, " //
+ "FLD_EVENT TEXT" //
+ ")" //
其中 FLD_MON 字段在 [1,12] 范围内,并且 FLD_DATE [1,31]、FLD_HOUR [0,23]、FLD_MIN [0,59]
并且针对下表的 rawQuery 不返回任何结果集:
public List<Reminder> getRemindersBetween(int y1, int m1, int d1, int h1, int min1, int y2, int m2, int d2, int h2,
int min2)
String sql = "SELECT FLD_YEAR, FLD_MON, FLD_DATE, FLD_HOUR, FLD_MIN, FLD_EVENT FROM TBL_REMINDERS "//
+ "WHERE (100000000 * FLD_YEAR + 1000000 * FLD_MON + 10000 * FLD_DATE + 100 * FLD_HOUR + FLD_MIN BETWEEN ? AND ?) " //
+ "ORDER BY FLD_YEAR, FLD_MON, FLD_DATE, FLD_HOUR, FLD_MIN, FLD_EVENT ";
SQLiteDatabase db = null;
Cursor cur = null;
try
db = new CalendarDBOpenHelper(context).getReadableDatabase();
cur = db.rawQuery(sql, new String[] "" + (100000000 * y1 + 1000000 * m1 + 10000 * d1 + 100 * h1 + min1),//
"" + (100000000 * y2 + 1000000 * m2 + 10000 * d2 + 100 * h2 + min2 - 1) //
);
List<Reminder> list = new ArrayList<Reminder>();
while (cur.moveToNext())
int year = cur.getInt(0);
int mon = cur.getInt(1);
int date = cur.getInt(2);
int hour = cur.getInt(3);
int min = cur.getInt(4);
String event = cur.getString(5);
list.add(new Reminder(year, mon, date, hour, min, event));
return list;
finally
if (null != cur)
try
cur.close();
catch (Exception e)
e.printStackTrace();
if (null != db)
try
db.close();
catch (Exception e)
e.printStackTrace();
而下面的另一个 rawQuery 工作正常:
public List<Reminder> getRemindersOfDate(int y, int m, int d)
String sql = "SELECT FLD_HOUR, FLD_MIN, FLD_EVENT FROM TBL_REMINDERS "//
+ "WHERE FLD_YEAR=? AND FLD_MON=? AND FLD_DATE=? " //
+ "ORDER BY FLD_HOUR, FLD_MIN, FLD_EVENT";
SQLiteDatabase db = null;
Cursor cur = null;
try
db = new CalendarDBOpenHelper(context).getReadableDatabase();
cur = db.rawQuery(sql, new String[] "" + y, "" + m, "" + d );
List<Reminder> reminders = new ArrayList<Reminder>();
while (cur.moveToNext())
int hour = cur.getInt(0);
int min = cur.getInt(1);
String event = cur.getString(2);
reminders.add(new Reminder(y, m, d, hour, min, event));
return reminders;
finally
if (null != cur)
try
cur.close();
catch (Exception e)
e.printStackTrace();
if (null != db)
try
db.close();
catch (Exception e)
e.printStackTrace();
// finally
我想这是“...和...之间”的条件造成了麻烦,因为这是两个 SQL 查询之间的唯一区别。但我不确定
编辑:
事情变得有趣起来。我现在确定问题是由 where 子句中的表达式引起的。在上面的第二种方法中,如果我修改
+ "WHERE FLD_YEAR=? AND FLD_MON=? AND FLD_DATE=? " //
到
+ "WHERE 10 * FLD_YEAR=? AND FLD_MON=? AND FLD_DATE=? " //
还有
cur = db.rawQuery(sql, new String[] "" + (10 * y), "" + m, "" + d );
那我什么也得不到
【问题讨论】:
【参考方案1】:好吧,首先:它们绝对不一样。
第一个返回特定时间跨度内的匹配条目。 第二个返回月份、年份和日期具有给定值的条目。
编辑
尽量在表达式中使用大括号,所以(10 * FLD_YEAR)
【讨论】:
感谢您的推荐。首先,我承认他们不一样。其次,它不是时间戳,而是 YYYYMMDDHHMM 整数表示。请您解释一下为什么以及如何出错? 你是对的。没想到这么坑。我想到了一个时间戳,你的计算实际上并不代表它。我撤销了我的声明。 我编辑了我的问题,请看一下。我对 SQLite 几乎没有经验,无法弄清楚原因。有什么建议吗? 使用大括号没有区别。仍然没有结果集以上是关于android:SQLite 查询与条件之间的问题的主要内容,如果未能解决你的问题,请参考以下文章
android如何用SQLite 的query方法查询某行某列的值,也就是两个限制条件,请问参数怎么写?