检查SQLite数据库中是否存在行

时间:2015-08-15 03:15:18

标签: java android android-sqlite

我正在尝试搜索数据库以查看是否存在行。我在另一个Stackoverflow帖子中找到了以下代码:

public static boolean CheckIsDataAlreadyInDBorNot(String TableName,
        String dbfield, String fieldValue) {
    SQLiteDatabase sqldb = EGLifeStyleApplication.sqLiteDatabase;
    String Query = "Select * from " + TableName + " where " + dbfield + " = " + fieldValue;
    Cursor cursor = sqldb.rawQuery(Query, null);
        if(cursor.getCount() <= 0){
            cursor.close();
            return false;
        }
    cursor.close();
    return true;
}

我的数据库包含三列id一个整数主键,title作为文本,episodes作为文本。数据库创建成功,我能够存储和检索条目,但是当我实现上面的代码时,我的程序会崩溃,告诉我fieldValue没有列名。

我正在调用方法,我的表名为TableName,列名为dbfield,我要查找的条目为fieldValue

这样做会抛出一个异常,说明fieldValue列不存在。我明白这个错吗? fieldValue将是我在数据库中搜索的其中一列中的字符串条目吗?

2 个答案:

答案 0 :(得分:0)

我更喜欢使用SELECT COUNT(*) ...查询,因为它只返回带有单个整数值的1x1游标。

public static boolean valueExistsInDb(String table, String field, String value) {
    SQLiteDatabase sqldb = EGLifeStyleApplication.sqLiteDatabase;
    String sql = "SELECT COUNT(*) FROM " + table + " WHERE " + field + " = ?";
    String[] sqlArgs = new String[]{ value };
    Cursor cursor = sqldb.rawQuery(sql, sqlArgs);
    if (cursor != null) {
        try {
            return cursor.getInt(0) > 0;
        } finally {
            cursor.close();
    }
    return false;
}

答案 1 :(得分:-1)

是的......至少有两件事是错的。

  1. 此代码容易受到SQL注入攻击。您可以接收任何字符串值,然后执行它。此包括某人能够删除您的数据库表。你从不想要使用字符串插值;查看Android相当于预备语句的内容。始终使用具体的表名称,并更喜欢具体的列名称。

  2. 检查数据库中是否存在特定值是一个简单的String query = "select exists(select * from concreteTableName where concreteField = ?)" 查询。你可以像这样重写它:

    $(document).ready(function(){
    // AJAX, etc in here ...
    });