SQLiteDatabase.rawQuery(sql,new String[name,age,null]}) 一个参数无关紧要



>我的Android应用程序中有一个用户界面,允许用户从sqlite数据库中选择他们想要看到的内容。
例如,用户可以选择查看男性联系人,但用户也可以选择"无关紧要"来查看男性和女性。我编写了以下代码来从数据库中获取联系人。

public List<Contact> get_contact(String name, String age, String gender){
List<Contact> contacts=new ArrayList<>();
DatabaseHelper dbHelper=new DatabaseHelper(context);
SQLiteDatabase db=dbHelper.getReadableDatabase();
String sql="SELECT * FROM Tablename WHERE name = ? AND" +
" age = ? AND" +
" gender = ?";
String[] selectionArgs = new String[]{name, age, gender};
Cursor cursor=db.rawQuery(sql,selectionArgs);
if (cursor.moveToFirst()) {
do {
Contact contact = new Contact();
contact.setName(cursor.getString(cursor.getColumnIndex("name")));
contact.setAge(cursor.getString(cursor.getColumnIndex("age")));
contact.setGender(cursor.getString(cursor.getColumnIndex("gender")));
contacts.add(contact);
} while (cursor.moveToNext());
}
if (cursor != null && !cursor.isClosed()) {
cursor.close();
}
return contacts;
}

但问题是当用户选择"无关紧要"时,例如年龄或性别,我不知道该怎么做。我使用此代码获取了 20 岁的所有联系人,但它不起作用。

List<Contact> contacts = get_contact(null,"20",null);

而且我不想为每个状态编写不同的查询,因为状态太多,实际上对于 get_contact(( 方法,我有 5 个参数而不是 3 个参数。

这是我得到的错误。

java.lang.IllegalArgumentException:索引 3 处的绑定值为 null

要处理如此多的条件而不硬编码大量"select"语句,您必须在代码中构建"where"子句。像这样:

String where = "";
if (name != null) {
where = " AND name = ?";
}
if (age != null) {
where += " AND age = ?";
}
if (gender != null) {
where += " AND gender = ?";
}
String sqlStatement = "SELECT * FROM Tablename";
if (where.length() > 0) {
sqlStatement += " WHERE " + where.substring(5);
}

您会注意到,最后的"where"子句将以"AND"开头。where.substring(5)在将"where"子句连接到选择语句之前去掉了"AND"。

以类似的方式,您还需要构建选择参数。可能使用List并将其转换为String[]最有意义。有关如何进行转换,请参阅此文档。

您可能还需要考虑使用StringBuilder类来构建 "where" 子句,但这对于您正在尝试的内容来说是次要的。

最新更新