【问题标题】:Android SqlLite check if two values exist in 2 different columnsAndroid Sqlite 检查两个值是否存在于 2 个不同的列中
【发布时间】:2017-09-03 07:33:27
【问题描述】:

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

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

【问题讨论】:

  • 不行,怎么办?它是失败还是游标没有返回数据(即 checkExist 总是返回 false)?如果失败,则包括日志。如果它返回 do 数据,那么我建议在 boolean exists = c.moveToFirst(); 处放置一个断点,然后从调试器中查看光标。尤其是生成的查询。
  • 应用程序崩溃
  • 请包含 logcat。糟糕,很抱歉错过了您所说的崩溃。嗯,猜测它是从 0 行开始的 INDEX 1 行的消息,因为光标没有行并且您正在尝试移动。您应该使用 c.getCount() 检查游标中的行数,如果大于 0,则返回 true,否则返回 false。
  • 查询是否正确?
  • boolean exists = cursor.getCount() > 0

标签: android sqlite android-sqlite


【解决方案1】:

您遇到的一个问题是,如果在您尝试移动到空游标中的一行时不存在匹配项,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+"=?" 的东西。 SQLAND 将按照String SQLAND=" AND ";

的行定义

PS 看看 Cricket_007 的答案,代码更简洁/更好更容易阅读。

【讨论】:

  • 你的间距也关闭了
  • queryNumEntries() 会更简单。
  • 无论我做什么,它都会不断粉碎
  • 您必须编辑您的问题并包含 logcat。
【解决方案2】:

您的间距已关闭。 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;
}

【讨论】:

    【解决方案3】:

    你应该使用 c.getCount() 而不是 c.moveToFirst()

    如果值大于0,则存在

    【讨论】:

    • 喜欢人们接受你的答案,用更多的措辞重新发布它,然后对你的答案投反对票。
    猜你喜欢
    • 2019-09-13
    • 1970-01-01
    • 2014-10-18
    • 2017-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-26
    相关资源
    最近更新 更多