我正在开发一个用户输入标题和日期的应用程序。我想防止在同一天输入重复的标题到数据库。我正在检查所选日期是否存在标题。但是我的查询似乎不起作用,我不知道为什么,应用程序只是崩溃。这个查询是否正确?有人可以帮忙吗?
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;
}
答案 0 :(得分:1)
您遇到的一个问题是,当您尝试移动到空游标中的某行时,c.moveToFirst
将始终失败。
解决方法是不使用c.moveToFirst
而是获取行数,然后相应地设置返回值。
e.g。
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+"=?"
的内容。其中SQLAND将沿String SQLAND=" AND ";
PS看看Cricket_007的答案,代码更整洁/更好,更容易阅读。
答案 1 :(得分:0)
您的间距已关闭。 TITLE+"=?" +"AND" + DATE
变为TITLE=?ANDDATE=?
我会建议这个。见DatabaseUtils.queryNumEntries
public boolean checkExist(String title, String date) {
SQLiteDatabase db = getReadableDatabase();
String[] args = new String[] {title,date};
String filter = String.format("%s=? AND %s=?", TITLE, DATE);
return DatabaseUtils.queryNumEntries(db, TABLE_NAME, filter, args) > 0;
}
答案 2 :(得分:-1)
你应该使用c.getCount()而不是c.moveToFirst()
如果值大于0,则存在