我正在开发一个应用程序,其中用户输入标题和日期。我想防止重复的标题在同一天输入到数据库中。我正在检查标题在所选日期是否存在。但是我的查询似乎不起作用,我不知道为什么,应用程序崩溃了。此查询正确吗?有人可以帮忙吗?
public boolean checkExist(String title, String date) {
SQLiteDatabase db = this.getWritableDatabase();
Cursor c = db.rawQuery("SELECT * FROM "+TABLE_NAME+" WHERE "+TITLE+"=?" +"AND" + DATE+"=?", new String[] {title,date});
boolean exists = c.moveToFirst();
c.close();
return exists;
}
最佳答案
您遇到的一个问题是,如果不存在匹配项,则c.moveToFirst
总是会失败,因为您试图移动到空游标中的行。
解决方案是不使用c.moveToFirst
而是获取行数,然后相应地设置返回值。
例如
public boolean checkExist(String title, String date) {
SQLiteDatabase db = this.getWritableDatabase();
Cursor c = db.rawQuery("SELECT * FROM "+TABLE_NAME+" WHERE "+TITLE+"=?" +"AND" + DATE+"=?", new String[] {title,date});
boolean exists = c.getCount() > 0;
c.close();
return exists;
}
第二个问题是查询本身是错误的,因为AND关键字的两边都没有空格。那不是
Cursor c = db.rawQuery("SELECT * FROM "+TABLE_NAME+" WHERE "+TITLE+"=?" +"AND" + DATE+"=?", new String[] {title,date});
你应该有
Cursor c = db.rawQuery("SELECT * FROM "+TABLE_NAME+" WHERE "+TITLE+"=?" +" AND " + DATE+"=?", new String[] {title,date});
我个人为包含空格的SQL关键字设置了常量,然后使用它们。因此,我会有一些与
+TITLE+"=?" + SQLAND + DATE+"=?"
相似的东西。将在String SQLAND=" AND ";
的行中定义SQLAND的位置PS查看Cricket_007的答案,代码更整洁/更易于阅读。