Android SqlLite检查两个不同的列中是否存在两个值

时间:2017-04-07 19:58:46

标签: android sqlite android-sqlite

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

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;
}

3 个答案:

答案 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,则存在