Подтвердить что ты не робот

Почему у ContentValues ​​есть метод put, который поддерживает Boolean?

Класс ContentValues ​​содержит метод, который позволяет вводить Booleans в коллекцию значений. AFAIK, SQLite не содержит собственный логический формат, который Android может вставлять в значение логические значения. Итак, какое волшебство делает Android за кулисами, чтобы сохранить эти ценности?

Кроме того, почему нет бесплатного метода getBoolean для курсора? Для меня это выглядит довольно неудобно, потому что, похоже, нет "безопасного" способа получения логического значения, которое было помещено в БД через ContentValues. Что мне не хватает?

Этот вопрос может показаться немного фривольным, поскольку я подозреваю, что логическое значение хранится как целое число 1 или 0, но почему Android обязуется разработчикам сделать это предположение? Насколько мне известно, он даже не задокументирован.

4b9b3361

Ответ 1

Класс ContentValues ​​содержит метод, который позволяет использовать Booleans в набор значений. НАСКОЛЬКО МНЕ ИЗВЕСТНО, SQLite не содержит Булевский формат, который Android может булевские значения в. И что волшебство делает Android за сцены для сохранения этих значений?

Из чтения этого документа, похоже, что преобразование boolean в integer выполняется SQLite.

Кроме того, почему нет бесплатного getBoolean метод на курсор? Мне, это кажется довольно ужасным дизайн, поскольку быть "безопасным" способом получения логическое значение, которое было введено в БД через ContentValues. Что мне не хватает?

Если вы читаете курсор, то знаете, какие столбцы должны быть возвращены из запроса, поэтому вы, вероятно, знаете типы данных запрашиваемых столбцов. Я согласен с тем, что метод getBoolean будет лучше, но работать с ним непросто.

Ответ 2

UPDATE

Google исправил ранее упомянутую ошибку, хотя она еще не была реализована во время этого сообщения:

https://code.google.com/p/android/issues/detail?id=232274


Стоит отметить, что текущий API опасен и может сломать ваше приложение, если что-то изменится под капотом.

Кроме того, ContentValues.getBoolean имеет серьезную проблему: если вы создаете ContentValues с DatabaseUtils.cursorRowToContentValues, он будет обрабатывать поле EVERY как строку:

values.put(columns[i], cursor.getString(i));

Когда вы затем получите поле через ContentValues.getBoolean, вы ВСЕГДА получите false:

if (value instanceof CharSequence) {
    return Boolean.valueOf(value.toString());

Поскольку значение равно "0" или "1", это преобразование не выполняется:

private static boolean toBoolean(String name) {
    return ((name != null) && name.equalsIgnoreCase("true"));

Поэтому я настоятельно рекомендую вам создать свой собственный геттер и сеттер, чтобы ваше поведение было четко определено.