programacion - manual de android en pdf
¿Podemos usar Guid como clave principal en la base de datos Sqlite? (2)
¿Es posible usar GUID como claves primarias en la base de datos SQLITE? Si es posible, ¿qué tipo de datos se puede usar?
sqlite3
no tiene un formato UUID nativo de 128 bits, per se.
Sin embargo, los GUID se pueden usar como claves en SQLite como una representación BLOB
TEXT
o binaria.
En función de las cifras de rendimiento publicadas en respuesta a una pregunta similar, los UUID binarios y de cadena pueden ser eficientes en SQLite para Crear y Consultar cuando se indexan .
ver la tabla en: https://.com/a/11337522/3103448
SQLite puede genarar UUID BLOB o TEXT con randomblob(16)
y hex(X)
Por ejemplo: lower(hex(randomblob(16)))
Con un rendimiento del índice similar, una desventaja significativa se convierte en si se prefiere una cadena legible por humanos al tamaño más pequeño de datos binarios .
SQLite en sí mismo no es compatible con GUID
como tipo interno.
¡Excepto que sí! (más o menos) Recuerde, en SQLite cualquier cadena se puede usar como nombre de tipo, y eso incluye GUID
o UUID
(lea más sobre los tipos de datos SQLite ).
De acuerdo con esas reglas, el tipo de GUID
tiene una afinidad NONE
, que es la misma que para los campos BLOB
. Con esto en mente, puede crear una columna de tipo GUID
y usar las siguientes reglas para acceder a ella:
Guárdelo como una cadena como
X''01020304050607080910111213141516''
(la notación X se usa para representar el valor deBLOB
16 bytes). Para insertar, use:INSERT INTO mytable (uuid) VALUES (X''01020304050607080910111213141516'');
Léelo como
BLOB
16 bytes.quote(uuid)
se puede usar para formatear el resultado usando la notación X:SELECT quote(uuid) FROM mytable
Dicha columna también se puede usar como clave principal. Desafortunadamente, no existe la funcionalidad AUTOINCREMENT como existe para las claves primarias enteras; tendrá que manejarlo usted mismo. Puede usar algo tan simple como randomblob(16)
para eso, pero no es bastante UUID
como se define en el estándar .
Confusamente, también puede almacenar la representación de texto de UUID en el mismo campo (SQLite no le impedirá hacerlo), pero le tomará al menos 2 veces más espacio: BLOB tiene 16 bytes, UUID ya que el texto tiene al menos 32 bytes.