我正在尝试搜索数据库以查看是否存在行。我在另一个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
将是我在数据库中搜索的其中一列中的字符串条目吗?
答案 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)
是的......至少有两件事是错的。
此代码容易受到SQL注入攻击。您可以接收任何字符串值,然后执行它。此包括某人能够删除您的数据库表。你从不想要使用字符串插值;查看Android相当于预备语句的内容。始终使用具体的表名称,并更喜欢具体的列名称。
检查数据库中是否存在特定值是一个简单的String query = "select exists(select * from concreteTableName where concreteField = ?)"
查询。你可以像这样重写它:
$(document).ready(function(){
// AJAX, etc in here ...
});