Java 检查SQLite数据库中是否存在行
我正在尝试搜索数据库以查看是否存在行。我在另一个Stackoverflow帖子中发现了以下代码: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
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帖子上的答案。。。