Si votre application nécessite une base de données et qu'elle contient des données intégrées, quelle est la meilleure façon d'expédier cette application? Devrais-je:
Précréer la base de données SQLite et l'inclure dans le
.apk
?Inclure les commandes SQL avec l'application et faire créer la base de données et insérer les données lors de la première utilisation?
Les inconvénients que je vois sont:
D'éventuelles discordances entre les versions de SQLite pourraient causer des problèmes et je ne sais pas actuellement où la base de données doit aller et comment y accéder.
La création et le remplissage de la base de données sur l'appareil peuvent prendre beaucoup de temps.
Aucune suggestion? Des pointeurs vers la documentation concernant tout problème seraient grandement appréciés.
la source
Réponses:
Il existe deux options pour créer et mettre à jour des bases de données.
L'une consiste à créer une base de données en externe, puis à la placer dans le dossier des ressources du projet, puis à copier la base de données entière à partir de là. C'est beaucoup plus rapide si la base de données contient beaucoup de tables et d'autres composants. Les mises à niveau sont déclenchées en modifiant le numéro de version de la base de données dans le fichier res / values / strings.xml. Les mises à niveau seraient ensuite réalisées en créant une nouvelle base de données en externe, en remplaçant l'ancienne base de données du dossier d'actifs par la nouvelle base de données, en enregistrant l'ancienne base de données dans le stockage interne sous un autre nom, en copiant la nouvelle base de données du dossier d'actifs dans le stockage interne, en transférant tous des données de l'ancienne base de données (renommée précédemment) dans la nouvelle base de données et enfin la suppression de l'ancienne base de données. Vous pouvez créer une base de données à l'origine en utilisant lePlugin SQLite Manager FireFox pour exécuter vos instructions SQL de création.
L'autre option consiste à créer une base de données en interne à partir d'un fichier sql. Ce n'est pas aussi rapide, mais le délai serait probablement imperceptible pour les utilisateurs si la base de données ne contient que quelques tables. Les mises à niveau sont déclenchées en modifiant le numéro de version de la base de données dans le fichier res / values / strings.xml. Les mises à niveau seraient alors effectuées en traitant un fichier sql de mise à niveau. Les données de la base de données resteront inchangées, sauf lorsque son conteneur est supprimé, par exemple en supprimant une table.
L'exemple ci-dessous montre comment utiliser l'une ou l'autre méthode.
Voici un exemple de fichier create_database.sql. Il doit être placé dans le dossier des ressources du projet pour la méthode interne ou copié dans le "Exécuter SQL" de SQLite Manager pour créer la base de données pour la méthode externe. (REMARQUE: notez le commentaire sur la table requise par Android.)
Voici un exemple de fichier update_database.sql. Il doit être placé dans le dossier des ressources du projet pour la méthode interne ou copié dans le "Exécuter SQL" de SQLite Manager pour créer la base de données pour la méthode externe. (REMARQUE: notez que les trois types de commentaires SQL seront ignorés par l'analyseur sql inclus dans cet exemple.)
Voici une entrée à ajouter au fichier /res/values/strings.xml pour le numéro de version de la base de données.
Voici une activité qui accède à la base de données puis l'utilise. ( Remarque: vous souhaiterez peut-être exécuter le code de la base de données dans un thread distinct s'il utilise beaucoup de ressources. )
Voici la classe d'assistance de base de données dans laquelle la base de données est créée ou mise à jour si nécessaire. (REMARQUE: Android nécessite que vous créiez une classe qui étend SQLiteOpenHelper afin de fonctionner avec une base de données Sqlite.)
Voici la classe FileHelper qui contient des méthodes pour copier des fichiers de flux d'octets et analyser des fichiers SQL.
la source
La
SQLiteAssetHelper
bibliothèque rend cette tâche très simple.Il est facile d'ajouter en tant que dépendance gradle (mais un Jar est également disponible pour Ant / Eclipse), et avec la documentation, il peut être trouvé à:
https://github.com/jgilfelt/android-sqlite-asset-helper
Remarque: Ce projet n'est plus maintenu comme indiqué sur le lien Github ci-dessus.
Comme expliqué dans la documentation:
Ajoutez la dépendance au fichier de génération de gradle de votre module:
Copiez la base de données dans le répertoire des ressources, dans un sous-répertoire appelé
assets/databases
. Par exemple:assets/databases/my_database.db
(Facultativement, vous pouvez compresser la base de données dans un fichier zip tel que
assets/databases/my_database.zip
. Ce n'est pas nécessaire, car l'APK est déjà compressé dans son ensemble.)Créez une classe, par exemple:
la source
Ma solution n'utilise aucune bibliothèque tierce ni ne vous oblige à appeler des méthodes personnalisées sur la
SQLiteOpenHelper
sous-classe pour initialiser la base de données lors de la création. Il prend également en charge les mises à niveau de la base de données. Il suffit de sous-classerSQLiteOpenHelper
.Prérequis:
android_metadata
avec un attributlocale
ayant la valeuren_US
en plus des tables uniques à votre application.Sous
SQLiteOpenHelper
- classement :SQLiteOpenHelper
.private
méthode dans laSQLiteOpenHelper
sous - classe. Cette méthode contient la logique pour copier le contenu de la base de données du fichier de base de données dans le dossier «assets» vers la base de données créée dans le contexte du package d'application.onCreate
,onUpgrade
etonOpen
les méthodes deSQLiteOpenHelper
.Assez dit. Voici la
SQLiteOpenHelper
sous - classe:Enfin, pour obtenir une connexion à la base de données, il suffit d'appeler
getReadableDatabase()
ougetWritableDatabase()
sur laSQLiteOpenHelper
sous - classe et il se chargera de créer une base de données, en copiant le contenu de la base de données à partir du fichier spécifié dans le dossier 'assets', si la base de données n'existe pas.En bref, vous pouvez utiliser la
SQLiteOpenHelper
sous - classe pour accéder à la base de données livrée dans le dossier des ressources comme vous le feriez pour une base de données initialisée à l'aide de requêtes SQL dans laonCreate()
méthode.la source
Expédition de l'application avec un fichier de base de données, dans Android Studio 3.0
L'expédition de l'application avec un fichier de base de données est une bonne idée pour moi. L'avantage est que vous n'avez pas besoin de faire une initialisation complexe, ce qui coûte parfois beaucoup de temps, si votre ensemble de données est énorme.
Étape 1: préparer le fichier de base de données
Préparez votre fichier de base de données. Il peut s'agir d'un fichier .db ou d'un fichier .sqlite. Si vous utilisez un fichier .sqlite, tout ce que vous devez faire est de modifier les noms d'extension de fichier. Les étapes sont les mêmes.
Dans cet exemple, j'ai préparé un fichier appelé testDB.db. Il a une table et quelques exemples de données comme celui-ci
Étape 2: importez le fichier dans votre projet
Créez le dossier des ressources si vous n'en avez pas. Copiez et collez ensuite le fichier de base de données dans ce dossier
Étape 3: copiez le fichier dans le dossier de données de l'application
Vous devez copier le fichier de base de données dans le dossier de données de l'application afin de poursuivre l'interaction avec celui-ci. Il s'agit d'une action unique (initialisation) pour copier le fichier de base de données. Si vous appelez ce code plusieurs fois, le fichier de base de données du dossier de données sera écrasé par celui du dossier d'actifs. Ce processus de remplacement est utile lorsque vous souhaitez mettre à jour la base de données à l'avenir lors de la mise à jour de l'application.
Notez que lors de la mise à jour de l'application, ce fichier de base de données ne sera pas modifié dans le dossier de données de l'application. Seule la désinstallation la supprimera.
Le fichier de base de données doit être copié dans le
/databases
dossier. Ouvrez l'Explorateur de fichiers de périphérique. Entrez l'data/data/<YourAppName>/
emplacement. Il s'agit du dossier de données par défaut de l'application mentionné ci-dessus. Et par défaut, le fichier de base de données sera placé dans un autre dossier appelé bases de données sous ce répertoireMaintenant, le processus de copie des fichiers ressemble à peu près à ce que fait Java. Utilisez le code suivant pour faire le copier-coller. Ceci est le code d'initiation. Il peut également être utilisé pour mettre à jour (par écrasement) le fichier de base de données à l'avenir.
Actualisez ensuite le dossier pour vérifier le processus de copie
Étape 4: créer un assistant d'ouverture de base de données
Créer une sous-classe pour
SQLiteOpenHelper
, avec connect, close, path, etc. Je l'ai nomméeDatabaseOpenHelper
Étape 5: créer une classe de niveau supérieur pour interagir avec la base de données
Ce sera la classe qui lit et écrit votre fichier de base de données. Il existe également un exemple de requête pour imprimer la valeur dans la base de données.
Étape 6: test en cours d'exécution
Testez le code en exécutant les lignes de codes suivantes.
Appuyez sur le bouton Exécuter et applaudissez!
la source
En novembre 2017, Google a publié la bibliothèque Room Persistence .
De la documentation:
La base de données Room a un rappel lorsque la base de données est créée ou ouverte pour la première fois. Vous pouvez utiliser le rappel de création pour remplir votre base de données.
Code de ce billet de blog .
la source
D'après ce que j'ai vu, vous devriez expédier une base de données contenant déjà la configuration des tables et les données. Cependant, si vous le souhaitez (et selon le type d'application que vous avez), vous pouvez autoriser "l'option de mise à niveau de la base de données". Ensuite, vous devez télécharger la dernière version de sqlite, obtenir les dernières instructions Insert / Create d'un fichier texte hébergé en ligne, exécuter les instructions et effectuer un transfert de données de l'ancienne base de données vers la nouvelle.
la source
Enfin je l'ai fait !! J'ai utilisé cette aide de lien Utilisation de votre propre base de données SQLite dans les applications Android , mais j'ai dû la changer un peu.
Si vous avez plusieurs packages, vous devez mettre le nom du package principal ici:
private static String DB_PATH = "data/data/masterPakageName/databases";
J'ai changé la méthode qui copie la base de données du dossier local vers le dossier de l'émulateur! Il y avait un problème lorsque ce dossier n'existait pas. Donc, tout d'abord, il doit vérifier le chemin d'accès et s'il n'est pas là, il doit créer le dossier.
Dans le code précédent, la
copyDatabase
méthode n'a jamais été appelée lorsque la base de données n'existait pas et lacheckDataBase
méthode a provoqué une exception. j'ai donc changé un peu le code.Si votre base de données n'a pas d'extension de fichier, n'utilisez pas le nom de fichier avec une seule.
ça marche bien pour moi, j'espère que ça vous sera utile aussi
la source
Actuellement, il n'y a aucun moyen de pré-créer une base de données SQLite à livrer avec votre apk. Le mieux que vous puissiez faire est d'enregistrer le SQL approprié en tant que ressource et de les exécuter à partir de votre application. Oui, cela conduit à la duplication des données (les mêmes informations existent en tant que resrouce et en tant que base de données) mais il n'y a pas d'autre moyen pour le moment. Le seul facteur atténuant est que le fichier apk est compressé. Mon expérience est de 908 Ko compresse à moins de 268 Ko.
Le fil ci-dessous a la meilleure discussion / solution que j'ai trouvée avec un bon exemple de code.
http://groups.google.com/group/android-developers/msg/9f455ae93a1cf152
J'ai stocké mon instruction CREATE en tant que ressource de chaîne à lire avec Context.getString () et l'ai exécutée avec SQLiteDatabse.execSQL ().
J'ai stocké les données de mes insertions dans res / raw / inserts.sql (j'ai créé le fichier sql, 7000+ lignes). En utilisant la technique du lien ci-dessus, j'ai entré une boucle, lu le fichier ligne par ligne et concaténé les données dans "INSERT INTO tbl VALUE" et j'ai fait une autre SQLiteDatabase.execSQL (). Cela n'a aucun sens d'enregistrer 7000 "INSERT INTO tbl VALUE" quand ils peuvent être simplement concacténés.
Cela prend environ vingt secondes sur l'émulateur, je ne sais pas combien de temps cela prendrait sur un vrai téléphone, mais cela ne se produit qu'une seule fois, lorsque l'utilisateur démarre l'application pour la première fois.
la source
INSERT INTO table VALUES(...) VALUES(...) VALUES(...) ...
(1 ligne d'insertion devrait avoir 100 VALEURS). Il sera beaucoup plus efficace et réduira votre temps de démarrage de 20 à 2 ou 3 secondes.L'expédition de la base de données dans l'apk, puis sa copie
/data/data/...
doublera la taille de la base de données (1 en apk, 1 endata/data/...
) et augmentera la taille de l'apk (bien sûr). Votre base de données ne doit donc pas être trop volumineuse.la source
Android propose déjà une approche de gestion de base de données basée sur les versions. Cette approche a été mise à profit dans le cadre BARACUS pour les applications Android.
Il vous permet de gérer la base de données tout au long du cycle de vie de la version d'une application, étant en mesure de mettre à jour la base de données sqlite de n'importe quelle version précédente à la version actuelle.
En outre, il vous permet d'exécuter des sauvegardes à chaud et une récupération à chaud du SQLite.
Je ne suis pas sûr à 100%, mais une récupération à chaud pour un appareil spécifique peut vous permettre d'envoyer une base de données préparée dans votre application. Mais je ne suis pas sûr du format binaire de la base de données qui pourrait être spécifique à certains appareils, fournisseurs ou générations d'appareils.
Puisque le truc est Apache License 2, n'hésitez pas à réutiliser n'importe quelle partie du code, qui peut être trouvé sur github
ÉDITER :
Si vous souhaitez uniquement envoyer des données, vous pouvez envisager d'instancier et de conserver les POJO au premier démarrage des applications. BARACUS a un support intégré à cela (magasin de valeurs de clé intégré pour les informations de configuration, par exemple "APP_FIRST_RUN" plus un hook après-contexte-bootstrap afin d'exécuter des opérations post-lancement sur le contexte). Cela vous permet d'avoir des données couplées étroitement livrées avec votre application; dans la plupart des cas, cela correspondait à mes cas d'utilisation.
la source
Si les données requises ne sont pas trop grandes (les limites que je ne connais pas, cela dépend de beaucoup de choses), vous pouvez également télécharger les données (en XML, JSON, peu importe) à partir d'un site Web / d'une application Web. Après la réception, exécutez les instructions SQL en utilisant les données reçues en créant vos tables et en insérant les données.
Si votre application mobile contient de nombreuses données, il peut être plus facile de mettre à jour les données des applications installées avec des données ou des modifications plus précises.
la source
J'ai modifié la classe et les réponses à la question et écrit une classe qui permet de mettre à jour la base de données via DB_VERSION.
Utiliser une classe.
Dans la classe d'activité, déclarez les variables.
Dans la méthode onCreate, écrivez le code suivant.
Si vous ajoutez un fichier de base de données au dossier res / raw, utilisez la modification suivante de la classe.
http://blog.harrix.org/article/6784
la source
J'ai écrit une bibliothèque pour simplifier ce processus.
Il créera une base de données à partir d'un
assets/databases/myDb.db
fichier. De plus, vous obtiendrez toutes ces fonctionnalités:Clonez-le depuis github .
la source
J'utilise ORMLite et le code ci-dessous a fonctionné pour moi
Veuillez noter que le code extrait le fichier de base de données d'un fichier zip dans les actifs
la source