我很新的Android,我试图查询数据库表“房屋”的列大小,所有者和城市。Android SQLite像查询与多个,可选的条件作为准备好的语句

我想实现的方法

getHousesFromDatabase(String owner, String city, Integer size)

其中城市和大小可以为空。该方法应该返回大小,位置,城市字段与参数匹配的所有行,但前提是该参数不为空。 即

getHousesFromDatabase("John", null, null);应返回所有者为John的所有行,而不管其他列。

getHousesFromDatabase("John", "San Francisco", null);应该返回所有者为约翰和在旧金山的所有行,依此类推。

我当前的实现是这样的

public House getHousesFromDatabase(String owner, String city, Integer size) {

if (city == null && size == null) {

Cursor cursor = database.rawQuery("select * from " + SQLiteHelper.TABLE_HOUSES + " where "

+ COLUMN_OWNER + " like '" + owner + "%" + "'", null);

}

else if (city == null) {

Cursor cursor = database.rawQuery("select * from " + TABLE_HOUSES + " where "

+ COLUMN_OWNER + " like '" + owner + "%" + "'" +" and where " + COLUMN_SIZE + "like '"+ size +"%'", null);

}

else if (size == null) {

...

}

else {

...

}

}

在if语句覆盖每个可能的变化;但是这对我来说感觉非常笨拙,我想知道是否有一种更简单的方法,并且导致准备好的陈述? (从我读的内容来看,rawQuery()本身很容易被SQL注入,而SQLiteStatement.execute()不能用于查询)。

2015-10-03

z_eb

+0

你是什么意思与“弱势”?为什么不简单地动态构造SQL字符串? –

+0

容易受到SQL注入,我想(我会更新问题)。我认为使用类似SQLiteDatabase.query()方法的东西会自动防止SQL注入,而SQLiteDatabase.rawQuery()方法不会。所以你会建议rawQuery()字符串的动态构造? 我想知道是否可以使用query()更动态地执行此操作,或者使用具有针对SQL注入保护的动态rawQuery()。 –

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐