我的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);
我不想为每个州写一个不同的查询,因为有太多的状态,实际上我有5个参数而不是3个,对于get_contact()方法。
这是我得到的错误。
java.lang.IllegalArgumentException:索引3处的绑定值为null
答案 0 :(得分:1)
要处理这么多条件而不对大量“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”子句连接到select语句之前,where.substring(5)
删除了“AND”。
以类似的方式,您还需要构建选择参数。可能使用List
并将其转换为String[]
最有意义。有关如何进行转换,请参阅this documentation。
您可能还需要考虑使用StringBuilder
类来构建“where”子句,但这是您尝试的次要条件。