L’un des systèmes de gestion de bases de données relationnelles que l’on trouve dans une bibliothèque C est SQLite. Il est un peu différent des autres systèmes de gestion de base de données, car il possède une tonne de types de données. Mais l’une des questions les plus courantes que tout le monde se pose est de savoir comment stocker un tableau d’octets dans la base de données SQLite Android.

Vous devez suivre quelques étapes simples pour stocker le tableau : tout d’abord, interrogez les données de la table. Ensuite, assurez-vous de connaître le type de données dans la table en question. Enfin, appelez les données avec une simple commande read() dans votre code. Évidemment, assurez-vous que la commande est conforme au type de données.

Les étapes mentionnées ci-dessus sont simples mais incomplètes. Il y a quelques commandes compliquées que vous devrez effectuer avant d’obtenir le produit final souhaité. Mais d’abord, apprenons un peu plus sur SQLite.

Qu’est-ce que SQLite ?

Un système de gestion de base de données qui n’utilise pas de client-serveur mais qui est intégré dans le programme final – voilà ce qu’est SQLite. Il est simple à utiliser et rend le travail de la bibliothèque C plus rapide et plus fluide.

Il suit généralement la syntaxe PostgreSQL. Mais la syntaxe SQL typée n’est pas assez forte pour garantir l’intégrité du domaine. Cette simplicité permet de l’utiliser en insérant simplement une chaîne de caractères dans la colonne.

Au sein de la plateforme Android, l’utilisation de SQLite est assez populaire. La raison de son utilisation répandue est sa simplicité et sa nature intégrée. Une telle bibliothèque rend le stockage des données compact et rapide.

Types de données pour SQLite

La généralité des types de données utilisée pour SQLite est dynamique. Ainsi, le type de données d’une valeur est lié à la valeur elle-même et non au conteneur. Les types de données utilisés sont principalement statiques. Mais le système de types dynamiques de SQLite est compatible avec la plupart des moteurs de base de données.

Bien qu’il fonctionne à l’envers, il aura le même effet. Les bases de données de type statique collecteront les données et les stockeront dans SQLite comme elles l’auraient fait si le système était SQL.

Mais ce qui rend SQLite meilleur, ce sont ses options. Ce type dynamique permet de faire des choses qui sont impossibles dans les bases de données traditionnelles.

Quelques classes de stockage

Quelles que soient les données que vous voulez stocker, elles auront l’une des quatre classes suivantes –

  • NULL
  • INTEGER
  • REAL
  • TEXT
  • BLOB

Dans la plupart des cas, la classe de stockage est indiscernable du type de données.

Par exemple, une classe de stockage INTEGER stocke les données comme une valeur différente sur le disque. Mais dès que la valeur est lue, elle est convertie en un type de données général. On peut donc utiliser les termes de type de données et de classe de stockage de manière interchangeable.

Une chose qui rend SQLite un peu problématique est qu’il n’a pas de classe de stockage spécifique pour les booléens, la date et l’heure. Mais il peut stocker les valeurs en tant que TEXT, REAL ou INTEGER.

Les applications peuvent stocker ces données dans la classe qu’elles préfèrent. De plus, ces formats peuvent passer de l’un à l’autre librement.

Type d’affinité

Jetez un coup d’oeil à ceci –

how to store byte array in sqlite database android

Le code ici est un exemple de type rigide pour un moteur de base de données SQL. Ces bases de données à typage rigide convertissent les entiers en chaînes de caractères et vice-versa. Ici, ‘456’ est converti en 456 et 123 en ‘123’.

Pour s’assurer que SQLite est compatible avec de tels moteurs de base de données, l’exemple montré ci-dessus fonctionnera de la même manière qu’il l’aurait fait dans un moteur SQL. Tout ceci est possible parce que SQLite supporte “l’affinité de type” sur les colonnes.

Par affinité de type d’une colonne, on entend le type de données recommandé pour cette colonne. Mais il n’est pas limité à ce type particulier. On peut facilement stocker des données d’un type différent de celui qui est recommandé.

Dans SQLite, chaque colonne est sûre d’avoir au moins un des types d’affinité suivants –

  • TEXT
  • NUMERIQUE
  • INTEGER
  • REAL
  • BLOB

Ces types d’affinité, à leur tour, seront capables de stocker trois types de données.

Par exemple, une colonne d’affinité TEXT peut être utilisée pour stocker NULL, TEXT, ou BLOB. Mais si l’on essaie de stocker une valeur numérique dans cette colonne, les données donneront une sortie de type TEXT au lieu du type INTEGER/NUMERIC attendu.

Pour garantir le bon fonctionnement de l’application, il faut d’abord pouvoir déterminer la colonne. Pour ce faire, il suffit de regarder le type déclaré de la colonne. Si vous ne savez pas ce que cela signifie, jetez un coup d’œil à ce tableau.


Type d’affinité
ENTIER
TINYINT
SMALLINT
MEDIUMINT
BIGINT
UNSIGNED BIG INT
INT2
INT8
ENTIER
CARACTÈRE(20)
CARACTÈRE(70)CARACTÈRE(255)VARCHAR(255)
VARIANT
NCHAR(55)
NATIF
NVARCHAR(100)
TEXTE
CLOB
TEXTE
GOUTTEGOUTTE
VRAI FLOTTEUR
DOUBLE
DOUBLE PRÉCISION
RÉEL
NUMERIC
DECIMAL(10,5)
BOOLEAN
DATE
DATETIME
NUMÉRIQUE

Ce qui suit montre comment SQLite utilise l’affinité des colonnes et les convertit au type requis –

how to store byte array in sqlite database android

Expressions de comparaison

Les différents systèmes de gestion de bases de données sont assez dépendants des expressions que vous utilisez dans le code. Mais cela n’est pas vrai dans le cas de SQLite. Tous les ensembles standard que l’on utilise pour SQL sont applicables ici.

Une chose qui diffère de SQLite est que la comparaison dépend de la classe de stockage. Il y a quelques règles que la comparaison suit. Elles sont les suivantes,

La classe de stockage NULL est considérée comme la plus basse parmi tous les types de stockage.

  • Les valeurs INTEGER ou REAL sont inférieures aux valeurs TEXT ou BLOB. Mais si elles sont comparées à une autre valeur INTEGER ou REAL, alors les valeurs numériques sont prises en compte.
  • Une valeur BLOB est supérieure à une valeur TEXT. Et dans une comparaison entre deux valeurs TEXT, une séquence de collationnement est utilisée comme base de comparaison.
  • Pour une comparaison entre deux valeurs BLOB, on utilise memcmp().

Voici un exemple de comparaison –

how to store byte array in sqlite database android

Opérateurs à utiliser

Dans le cas des nombres, tous les opérateurs mathématiques sont utilisables. Ils peuvent également être utilisés pour STRING ou BLOB. Ceci est possible car les opérandes STRING ou BLOB sont automatiquement convertis en valeurs REAL ou INTEGER.

Voici comment la conversion s’effectue :

  • BLOB → TEXT → REAL
  • La valeur BLOB est convertie en TEXTE en convertissant la séquence d’octets comme pour la valeur BLOB.
  • Ensuite, pour convertir la valeur TEXT en REAL, on interprète le préfixe le plus long possible de la valeur qui se rapporte à un nombre réel.
  • Tout reste ou espace de tête dans la valeur TEXT est ignoré.
  • Si la valeur n’a pas de préfixe, alors le résultat de la conversion est 0,0.
  • BLOB → TEXTE → ENTIER
  • La valeur TEXTE trouvée dans la BLOB est interprétée, et le préfixe le plus long de la valeur est converti en un nombre entier.
  • Tout reste ou espace de tête est ignoré.
  • S’il n’y a pas de préfixe long qui s’interprète en un nombre entier, alors le résultat est 0.0.
  • Dans le cas où le nombre entier est supérieur ou inférieur à ±9223372036854775807, le résultat de la conversion est précisément celui-ci.
  • Pour un TEXTE qui pourrait donner FLOAT, l’exposant est ignoré.
  • La conversion est un peu défectueuse. Elle entraîne des pertes et peut aussi rendre les données irréversibles. Mais malgré ces défauts, les valeurs de type STRING ou BLOB sont toujours converties en REAL ou INTEGER.

Une nouvelle condition est imposée si les opérateurs mathématiques utilisés sont %, <<, >>, &, et |. Ces opérateurs ne fonctionnent que pour les valeurs de type INTEGER. Donc, si les données sont dans la classe REAL, elles sont converties en INTEGER.

Pour couler le numérique REAL en INTEGER, les étapes suivantes ont lieu,

REAL → INTEGER

  • Une valeur REAL convertie en INTEGER donne un résultat compris entre la valeur REAL et zéro.
  • Si la valeur est supérieure ou inférieure à ±9223372036854775807, le résultat reste le plus grand ou le plus petit INTEGER possible.

Triage

Une fois que les résultats de la requête sont triés, ce n’est qu’à ce moment-là que la conversion peut commencer. Toute tentative de stockage de la conversion de classe avant le tri se solde par un échec. Si le tri est effectué par ORDER, la séquence serait,

NULL → INTEGER → REAL → TEXT → BLOB

Si le tri est effectué selon GROUP, la séquence reste la même, mais les valeurs INTEGER et REAL sont comptabilisées sous la même classe de stockage. Dans ce cas, aucune affinité n’est applicable.

Lire et écrire les données

Maintenant que vous connaissez les types de données et les classes de stockage, vous comprenez également comment les trier et les convertir. Mais nous n’avons toujours pas parlé clairement des étapes qui vous aideront à lire, écrire et stocker les données.

Les étapes que vous devrez suivre pour enregistrer n’importe quel type de données sont similaires. Pour des raisons de simplicité, voyons les étapes pour la valeur BLOB.

Supposons que la table en question soit une table de matériaux. Si vous êtes prêt à suivre les étapes, voici la table que nous utiliserons pour l’exemple.

how to store byte array in sqlite database android
how to store byte array in sqlite database android

Dans cet exemple, nous devons stocker une image pour chaque valeur du tableau des matériaux. Voici les étapes que vous devez suivre,

  • Premièrement, ajoutez une colonne pour le type de données requis. Dans ce cas, le type de données est BLOB.
how to store byte array in sqlite database android
  • Ensuite, interrogez les données de la table pour le contenu. Cela donnera une valeur NULL dans la colonne image.
how to store byte array in sqlite database android
how to store byte array in sqlite database android
  • Préparez maintenant le fichier image que vous souhaitez enregistrer et placez-le dans un dossier. Par exemple, placez-le dans C:\temp, comme dans cette image.
how to store byte array in sqlite database android
  • Après avoir préparé l’image, vous devrez préparer une instruction UPDATE.
  • Obtenez ensuite l’objet Connection en vous connectant à la base de données SQLite.
  • Une fois connecté, créez un objet PreparedStatement.
  • Fournissez maintenant les valeurs en utilisant la méthode set* avec les paramètres correspondants de l’objet PreparedStatement.
  • Exécutez l’instruction UPDATE avec la méthode executeUpdate().
  • Assurez-vous d’utiliser des méthodes setBytes similaires au code suivant,
how to store byte array in sqlite database android
  • Ensuite, vous devez vous connecter à la base de données tset.db par la méthode connect() comme suit,
how to store byte array in sqlite database android
  • Le code suivant met à jour l’image pour le tableau des matériaux spécifiques, et il utilise la méthode updatePicture(),
how to store byte array in sqlite database android
  • Si vous voulez mettre à jour l’image pour l’identifiant de l’article 1, le code suivant peut être utilisé –
how to store byte array in sqlite database android
how to store byte array in sqlite database android
  • Enfin, exécutez à nouveau le programme et vérifiez le tableau des matériaux. Si toutes les étapes ont été correctement suivies, il devrait afficher quelque chose comme suit –

Mot de la fin

Le processus “comment stocker un tableau d’octets dans une base de données SQLite android” n’est pas compliqué si vous connaissez les étapes. Bien que les étapes puissent sembler confuses, elles ne le sont pas. Il vous suffit de les mettre en pratique une fois, et vous êtes prêt à partir. Si nous devions donner un aperçu des étapes, ce serait le suivant.

Categorized in:

Guide,