Почему у ContentValues ​​есть метод put, который поддерживает Boolean? - PullRequest
26 голосов
/ 02 мая 2011

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

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

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

Ответы [ 2 ]

10 голосов
/ 02 мая 2011

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

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

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

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

1 голос
/ 16 января 2017

UPDATE

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

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


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

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

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"));

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

...