Android ContentValues.get() отсутствует значение по сравнению со значением NULL

Я пишу класс ContentProvider (для инвентаря книги) и застрял при проверке правильности записей в функции insert(). Если значение недопустимо, я бы выбросил исключение IllegalArgumentException.

Одна строка - это цена книги, а строка определяется как

FLOAT(2) NOT NULL DEFAULT 9999

Поэтому, хотя я не принимаю явное значение NULL, я бы согласился с тем, что цена не определена в данных ContentValues. Затем будет установлено значение по умолчанию 9999. Теперь я могу попытаться получить значение с плавающей точкой, соответствующее ключу цены:

float price = values.getAsFloat(BookEntry.COLUMN_PRICE);

Но эта функция дает мне значение NULL либо тогда, когда ключ BookEntry.COLUMN_PRICE не находится внутри ContentValues, либо когда он там, но явно равен NULL (или не может быть преобразован в число с плавающей запятой). Я мог бы заранее проверить с помощью функции containsKey() ContentValues, есть ли запись, но никакой учебник, который я видел до сих пор, не делал этого.

Я делаю это слишком сложным или это путь?

//Check of the price is valid, i.e. larger than 0 and not null
    if (values.containsKey(BookEntry.COLUMN_PRICE)) {
        Float price = values.getAsFloat(BookEntry.COLUMN_PRICE);
        if (price == null) {
            throw new IllegalArgumentException("Price cannot be set as null and must be a float");
        } else if (price <= 0) {
            throw new IllegalArgumentException("Product requires a positive price");
        }
    }

1 ответ

Решение

Что вы делаете - проверка, находится ли ключ в ContentValues - верно. ContentValues это просто обертка вокруг HashMap: вернется null если карта не содержит сопоставления для ключа или если значение явно установлено в null,

Я мог бы заранее проверить с помощью функции containsKey() ContentValues, есть ли запись, но никакой учебник, который я видел до сих пор, не делал этого.

Некоторые учебные пособия представляют информацию в упрощенном виде (что хорошо), довольно часто пропуская хорошие практики кодирования (что опять-таки хорошо, иначе это становится слишком сложным)... так что не ограничивайте себя только тем, что вы видите в учебниках. Иногда ваша интуиция может предложить лучшее решение;).

Другие вопросы по тегам