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

Java 检查SQLite数据库中是否存在行,java,android,android-sqlite,Java,Android,Android Sqlite,我正在尝试搜索数据库以查看是否存在行。我在另一个Stackoverflow帖子中发现了以下代码: public static boolean CheckIsDataAlreadyInDBorNot(String TableName, String dbfield, String fieldValue) { SQLiteDatabase sqldb = EGLifeStyleApplication.sqLiteDatabase; String Query = "Se

我正在尝试搜索数据库以查看是否存在行。我在另一个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为整数主键,标题为文本,剧集为文本。数据库创建成功,我能够存储和检索条目,但当我实现上述代码时,我的程序会崩溃,告诉我fieldValue不存在列名

我使用表名TableName、列名dbfield和我要查找的条目fieldValue调用该方法


这样做会引发异常,说明fieldValue列不存在。我理解错了吗?fieldValue将是我在数据库中搜索的一列中的字符串条目,对吗

对……这至少有两件事不对

此代码易受SQL注入攻击。您可以接收任何字符串值并执行它。这包括有人能够删除您的数据库表。永远不要使用字符串插值;看看安卓系统中的预处理语句。始终使用具体的表名,并首选具体的列名

检查数据库中是否存在特定值是一个简单的exists查询。你可以这样重写它:

String query = "select exists(select * from concreteTableName where concreteField = ?)"
我更喜欢使用选择计数*。。。查询,因为它只返回一个带有单个整数值的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;
}

感谢您对SQL注入的解释,我已经替换了字符串。至于你向我提出的问题,我是否可以替换?有了我正在寻找的价值吗?再看看Android的PreparedStatement。其思想是,标记将被稍后搜索的值替换为位置。这是一条路吗?对于那些投反对票的人,我能解释一下原因吗?我只是想澄清另一个stackoverflow帖子上的答案。。。