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

时间:2017-08-09 17:12:37

标签: java android database sqlite

我的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

1 个答案:

答案 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”子句,但这是您尝试的次要条件。