Android SQLite: paramètre nullColumnHack dans les méthodes d'insertion / remplacement

96

Le SDK Android propose des méthodes pratiques pour manipuler les données avec SQLite. Cependant, les méthodes d' insertion et de remplacement utilisent des nullColumnHackparamètres dont l'utilisation que je ne comprends pas.

La documentation l'explique avec ce qui suit, mais que faire si une table a plusieurs colonnes qui le permettent NULL? Je ne comprends vraiment pas: /

SQL ne permet pas d'insérer une ligne complètement vide, donc si initialValues ​​est vide, cette colonne [ / row for replace ] se verra attribuer une NULLvaleur explicitement .

poussée
la source

Réponses:

195

Supposons que vous ayez une table nommée foooù toutes les colonnes autorisent les NULLvaleurs ou ont des valeurs par défaut.

Dans certaines implémentations SQL, ce serait du SQL valide:

INSERT INTO foo;

Ce n'est pas valide dans SQLite. Vous devez avoir au moins une colonne spécifiée:

INSERT INTO foo (somecol) VALUES (NULL);

Par conséquent, dans le cas où vous passez un vide ContentValuesà insert(), Android et SQLite ont besoin d'une colonne à attribuer NULLen toute sécurité . Si vous avez le choix entre plusieurs colonnes de ce type, choisissez-en une via le mécanisme de sélection de votre choix: lancer de dés, Magic 8-Ball (TM), coin flip, cubicle mate flip, etc.

Personnellement, j'aurais juste rendu illégal de passer un vide ContentValuesà insert(), mais ils ne m'ont pas demandé ... :-)

CommonsWare
la source