我正在开发一个应用程序,其中用户输入标题和日期。我想防止重复的标题在同一天输入到数据库中。我正在检查标题在所选日期是否存在。但是我的查询似乎不起作用,我不知道为什么,应用程序崩溃了。此查询正确吗?有人可以帮忙吗?

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的答案,代码更整洁/更易于阅读。

09-18 02:35