Perché ContentValues ​​ha un metodo put che supporta Boolean?

La class ContentValues ​​contiene un metodo che consente a Booleans di essere inseriti nella raccolta di valori. AFAIK, SQLite non contiene un formato booleano nativo che Android possa inserire i valori booleani. Quindi, che magia fa Android dietro le quinte per memorizzare questi valori?

Inoltre, perché non esiste un metodo getBoolean gratuito su un cursore? Per me, questo sembra essere un controllo del design piuttosto imbarazzante dal momento che non sembra esserci un modo “sicuro” di recuperare un valore booleano che è stato inserito nel DB tramite ContentValues. Cosa mi manca?

Questa domanda può sembrare un po ‘frivola dal momento che sospetto che i valori booleani siano memorizzati come numeri interi 1 o 0, ma perché Android dovrebbe impegnarsi con gli sviluppatori a fare quella premessa? Non è nemmeno documentato per quanto ne so.

La class ContentValues ​​contiene un metodo che consente a Booleans di essere inseriti nella raccolta di valori. AFAIK, SQLite non contiene un formato booleano nativo che Android possa inserire i valori booleani. Quindi, che magia fa Android dietro le quinte per memorizzare questi valori?

Dalla lettura di questo documento, sembra che la conversione da booleana a intera sia fatta da SQLite.

Inoltre, perché non esiste un metodo getBoolean gratuito su un cursore? Per me, questa sembra essere una supervisione del design piuttosto orribile dal momento che non sembra esserci un modo “sicuro” di recuperare un valore booleano che è stato inserito nel DB tramite ContentValues. Cosa mi manca?

Se stai leggendo da un cursore, sai quali colonne devono essere restituite dalla query, quindi presumibilmente conosci i tipi di dati delle colonne che sono state richieste. Sono d’accordo che avere un metodo getBoolean sarebbe meglio, ma non è difficile da aggirare.

AGGIORNARE

Google ha corretto il bug precedentemente citato, anche se non è ancora implementato al momento di questo post:

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


Vale la pena notare che l’API corrente è pericolosa e potrebbe interrompere la tua app se qualcosa cambia sotto il cofano.

Inoltre, ContentValues.getBoolean ha un grosso problema che se si creano i ContentValues con DatabaseUtils.cursorRowToContentValues si tratterà OGNI campo come una stringa:

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

Quando si recupera il campo tramite ContentValues.getBoolean si otterrà SEMPRE falso:

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

Poiché il valore è “0” o “1”, questa conversione non riesce:

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

Quindi consiglio vivamente di creare il proprio getter e setter in modo che il tuo comportamento sia ben definito.