6

由于 selectArgs 不正确,我正在执行以下方法但没有成功(至少这是我所相信的。

找到所有:

public Collection<Object> findAllByCodigoSetorOrderByStatusWhereDataAgendamentoIsNull(Integer vendedor) {
    Collection<Object> objects = null;
    String selection = Object.FIELDS[20] + "=?" + " OR " + Object.FIELDS[20] + "=?" + " OR " + Object.FIELDS[20] + "=?" + " AND " + Object.FIELDS[6] + "=?";
    String[] selectionArgs = new String[] { "''", "'null'", "NULL", String.valueOf(vendedor) };
    Collection<ContentValues> results = findAllObjects(Object.TABLE_NAME, selection, selectionArgs, Object.FIELDS, null, null, Object.FIELDS[4]);
    objects = new ArrayList<Object>();
    for (ContentValues result : results) {
        objects.add(new Object(result));
    }
    return objects;
}

查找所有对象:

protected Collection<ContentValues> findAllObjects(String table, String selection, String[] selectionArgs, String[] columns, String groupBy, String having, String orderBy) {
        Cursor cursor = null;
        ContentValues contentValue = null;
        Collection<ContentValues> contentValues = null;
        try {
            db = openRead(this.helper);
            if (db != null) {
                cursor = db.query(table, columns, selection, selectionArgs, groupBy, having, orderBy);
                contentValues = new ArrayList<ContentValues>();
                for (int i = 0; i < cursor.getCount(); i++) {
                    cursor.moveToPosition(i);
                    contentValue = new ContentValues();
                    for (int c = 0; c < cursor.getColumnCount(); c++) {
                        contentValue.put(cursor.getColumnName(c), cursor.getString(c));
                    }
                    contentValues.add(contentValue);
                    cursor.moveToNext();
                }
            }
            return contentValues;
        } finally {
            close(db);
        }
    }

如何使用 db.query 正确选择列并将其与 - null、'null' 和 '' 进行比较?

4

4 回答 4

14

Android 的数据库 API 不允许将NULL值作为参数传递;它只允许字符串。(这是一个可怕的设计错误。更糟糕的是,SQLiteStatement 确实允许所有类型的参数,但仅适用于返回单个值的查询。)

您别无选择,只能将查询字符串更改为blah IS NULL.

于 2013-04-11T17:02:47.927 回答
0

老问题,但我仍然坚持了几个小时,直到我找到了这个答案。无论出于何种原因,这种奇怪的行为(或错误)仍然存在于 android sdk 中,如果您想查询空值,只需执行

SQLiteDatabase db = getReadableDatabase();
ContentValues contentValues = new ContentValues();

contentValues.put("columnName", newValue);

String nullSelection = "columnName" + " IS NULL";

db.update("tableName", contentValues, nullSelection, null);
db.close();

在此示例中,我正在更新值,但仅在选择值时这是一个类似的概念

于 2016-12-20T04:47:33.943 回答
0

正如在其他答案中提到的,对于 null,需要使用“IS NULL”。这是一些同时具有 null 和字符串的便利代码(我在示例中使用 delete,但对于其他方法也可以这样做,例如查询):

public void deleteSomething(String param1, String param2, String param3) {
    ArrayList<String> queryParams = new ArrayList<>();

    mDb.delete(TABLE_NAME,
            COLUMN_A + getNullSafeComparison(param1, queryParams) + "AND " +
                    COLUMN_B + getNullSafeComparison(param2, queryParams) + "AND " +
                    COLUMN_C + getNullSafeComparison(param3, queryParams),
            queryParams.toArray(new String[0]));
}

private String getNullSafeComparison(String param, List<String> queryParams) {
    if (param == null) {
        return " IS NULL ";
    } else {
        queryParams.add(param);
        return " = ? ";
    }
}
于 2017-05-11T15:44:25.520 回答
0

您可以将NULL值绑定到SQLiteStatement

    SQLiteDatabase db = getWritableDatabase();
    SQLiteStatement stmt = db.compileStatement("UPDATE table SET " +
            "parameter=? WHERE id=?");
    if (param == null)
        stmt.bindNull(1);
    else
        stmt.bindString(1, param);
    stmt.execute();
    stmt.close();
    db.close();
于 2018-12-10T20:55:45.420 回答