Quand est SQLiteOpenHelper onCreate() / onUpgrade() exécuter?
J'ai créé mes tables de ma SQLiteOpenHelper
onCreate()
mais recevoir
SQLiteException: no such table
ou
SQLiteException: no such column
erreurs. Pourquoi?
REMARQUE:
(Ce qui est issue de la fusion résumé des dizaines de questions similaires chaque semaine. Cherchant à fournir un "canonique" wiki de la communauté de question/réponse, ici, de sorte que toutes ces questions peuvent être adressées à une bonne référence.)
Pouvez-vous poster le code?
Ce n'est pas un problème réel de la mine, juste marre écrit la même réponse/commentaire pour la Énième fois.
Ce n'est pas un problème réel de la mine, juste marre écrit la même réponse/commentaire pour la Énième fois.
OriginalL'auteur |
Vous devez vous connecter pour publier un commentaire.
SQLiteOpenHelper
onCreate()
etonUpgrade()
rappels sont invoquée lorsque la base de données est réellement ouvert, par exemple par un appel àgetWritableDatabase()
. La base de données n'est pas ouvert lorsque la base de données helper objet lui-même est créé.SQLiteOpenHelper
versions les fichiers de base de données. Le numéro de version est leint
argument passé à la constructeur. Dans le fichier de base de données, le numéro de version est stockée dansPRAGMA user_version
.onCreate()
n'est exécutée que lorsque le fichier de base de données n'existe pas et a été créé. SionCreate()
retourne avec succès (ne lance pas d'exception), la base de données est supposé être créé à la demande du numéro de version. Comme conséquence, vous ne devriez pas attraperSQLException
s dansonCreate()
vous-même.onUpgrade()
n'est appelée que lorsque le fichier de base de données existe, mais la version stockée est inférieure à celle demandée dans le constructeur. LeonUpgrade()
devrait mettre à jour le schéma de la table à la version demandée.Lors de la modification du schéma de la table dans le code (
onCreate()
), vous devez vous assurer que la base de données est mise à jour. Deux approches principales:Supprimer l'ancien fichier de base de données de sorte que
onCreate()
est exécuté à nouveau. C'est souvent préféré au temps de développement où vous avez le contrôle sur les versions installées et la perte de données n'est pas un problème. Quelques façons de supprimer le fichier de base de données:Désinstaller l'application. Utilisez le gestionnaire d'application ou
adb uninstall your.package.name
de la carapace.Effacer les données d'application. Utilisez le gestionnaire d'application.
Incrémenter la version de base de données de sorte que
onUpgrade()
est invoquée. C'est un peu plus compliqué que plus le code est nécessaire.Pour le temps de développement du schéma de mises à niveau où la perte de données n'est pas un problème, vous pouvez simplement utiliser
execSQL("DROP TABLE IF EXISTS <tablename>")
pour supprimer vos tables existantes et de les appeleronCreate()
pour recréer la base de données.Pour les versions, vous devez mettre en œuvre la migration des données dans
onUpgrade()
de sorte que vos utilisateurs ne perdent pas leurs données.Pas dans le champ d'application de cette question/réponse. Si vous avez une question, n'hésitez pas à poster une question.
Le numéro de version de votre code, c'est à dire quelle version de schéma le code prévoit pour exécuter sur. Si le fichier est plus grand (à partir d'une version précédente de l'application), il doit être mis à niveau.
Donc, j'ai besoin de coder en dur la VERSION DB dans la SQLiteHelper chaque fois que je modifie le schéma, de sorte que lorsque la vieille application s'exécute et obtenir la connexion db et de trouver qu'il est vieux, et puis onUpgrade sera trgiigered au lieu de onCreate, est-ce exact?
Lorsque vous mettez à jour votre schéma de base de données d'une version incompatible, alors oui, vous avez besoin de mettre à jour le numéro de version de distinguer incompatible fichiers de base de données.
onCreate()
n'est jamais déclenchée si la base de données existe déjà.OriginalL'auteur
De continuer à ajouter des points manquants ici, conformément à la demande par Jaskey
Version de base de données est stockée dans le
SQLite
fichier de base de données.catch est le constructeur
Ainsi, lorsque la base de données helper constructeur est appelé avec un
name
(2ème paramètre), plateforme vérifie si la base de données existe ou pas et si la base de données existe, il obtient les informations de version du fichier de base de données d'en-tête et déclenche le droit de retour d'appelComme déjà expliqué dans le vieux la réponse, si la base de données avec le nom n'existe pas, il déclenche
onCreate
.Ci-dessous l'explication explique
onUpgrade
cas avec un exemple.Dire, votre première version de l'application a la
DatabaseHelper
(extension deSQLiteOpenHelper
) avec le constructeur en passant de la version que1
et puis vous avez fourni une mise à niveau de l'application avec le nouveau code source ayant la version adoptée comme2
, puis automatiquement lorsque leDatabaseHelper
est construit, plate-forme de déclencheursonUpgrade
par voir le fichier existe déjà, mais la version est inférieure à la version actuelle qui vous avez passé.Maintenant que vous êtes de rabotage pour donner une troisième version de l'application avec la version db comme
3
(db version est augmenté uniquement lorsque schéma de base de données est d'être modifiées). Dans de tels différentiels mises à niveau, vous devez écrire la logique de mise à niveau à partir de chaque version de façon progressive pour un meilleur code maintenableExemple de pseudo-code ci-dessous:
Avis le manque
break
déclaration en cas1
et2
. C'est ce que je veux dire par la mise à niveau incrémentielle.Dire si l'ancienne version est
2
et la nouvelle version est4
, alors la logique de mise à niveau de la base de données de2
à3
puis à4
Si l'ancienne version est
3
et la nouvelle version est4
, il suffit d'exécuter la logique de mise à niveau pour3
à4
droit - faute de frappe.. mais si une nouvelle version est 5 -> alors il sera toujours jeter l'exception IllegalStateException et développeur de le réparer par l'ajout de cas 5..
Que faire si l'utilisateur les mises à niveau de son application à partir de la version 2 à 3 seulement? Dans ce cas également, tous les cas jusqu'à 4 sera exécuté.
l'utilisateur ne peut pas le faire. Il peut mettre à niveau 2 à la dernière (ici 4).
OriginalL'auteur
onCreate()
Lorsque nous créons la Base de données dans un premier temps (j'.e est la Base de données n'existe pas)
onCreate()
créer une base de données avec la version qui est transmis dansSQLiteOpenHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version)
onCreate()
méthode est de créer les tables que vous avez définies et d'exécuter tout autre code que vous avez écrit. Cependant, cette méthode sera appelée uniquement si le fichier SQLite est manquant dans votre app du répertoire de données (/data/data/your.apps.classpath/databases
).Cette méthode ne sera pas appelé si vous avez changé votre code et l'a relancé dans l'émulateur. Si vous voulez
onCreate()
à courir, vous devez utiliser adb pour supprimer le fichier de base de données SQLite.onUpgrade()
SQLiteOpenHelper
doit appeler le super constructeur.onUpgrade()
méthode sera appelée uniquement lorsque la version entier est plus grand que la version en cours d'exécution dans l'application.onUpgrade()
méthode à appeler, vous devez incrémenter le numéro de version dans votre code.OriginalL'auteur
Peut-être que je suis trop en retard, mais je tiens à partager mon court et doux de réponse.
Veuillez vérifier Réponse pour un même problème. Il va certainement vous aider. Pas plus profond spécifications.
Si vous êtes sûr de la syntaxe pour la création de la table, que cela peut arriver lorsque vous ajoutez une nouvelle colonne dans le même tableau, pour que...
1) Désinstaller de votre appareil et de l'exécuter à nouveau.
OU
2) Configuration -> app -> ClearData
OU
3) Changement
DATABASE_VERSION
dans votre "DatabaseHandler" classe (Si vous avez ajouté de nouveaux colonne qu'il sera automatiquement mis à niveau)OU
4) Changement
DATABASE_NAME
dans votre "DatabaseHandler" classe (j'ai fait face à un même problème. Mais je réussir en changeantDATABASE_NAME
.)OriginalL'auteur
Points à retenir lors de l'extension de
SQLiteOpenHelper
super(context, DBName, null, DBversion);
- Ce doit être invoquée première ligne du constructeuronCreate
etonUpgrade
(si nécessaire)onCreate
sera invoquée que lorsquegetWritableDatabase()
ougetReadableDatabase()
est exécutée. Et ce sera invoqué qu'une seule fois lorsque l'unDBName
spécifié dans la première étape n'est pas disponible. Vous pouvez ajouter de créer une table de requête suronCreate
méthodeDBversion
et de faire des requêtes dansonUpgrade
table ou tout simplement désinstaller puis installer l'application.OriginalL'auteur
Vous pouvez créer une base de données & tableau comme
Remarque : si vous souhaitez créer une autre table ou ajouter des colonnes ou pas de table, juste incrémenter la VERSION
OriginalL'auteur
onCreate est appelé pour la première fois lors de la création de tables sont nécessaires. Nous avons besoin de surcharger cette méthode où nous écrire le script pour la création de la table qui est exécuté par SQLiteDatabase. la méthode execSQL. Après l'exécution dans les premiers temps de déploiement, cette méthode ne sera pas appelé à partir.
onUpgrade
Cette méthode est appelée lors de la version de base de données est mis à jour. Supposons que, pour la première fois, le déploiement , la base de données de la version 1 et dans le deuxième déploiement il y a changement dans la structure de base de données, comme l'ajout de la colonne dans le tableau. Supposons que la base de données version est 2 maintenant.
OriginalL'auteur
pas un tel tableau est surtout quand vous n'avez pas ouvert le
SQLiteOpenHelper
classe avecgetwritabledata()
et avant cela, vous avez également à des appels de constructeur avec databasename & version.Et
OnUpgrade
est appelé à chaque fois qu'il y a de la mise à niveau de la valeur dans le numéro de version indiqué dansSQLiteOpenHelper
classe.Ci-dessous l'extrait de code (colonne trouvée peut-être à cause de sort dans la colonne nom):
OriginalL'auteur
Si vous oubliez de fournir un "nom" de la chaîne en tant que deuxième argument du constructeur, il crée un "mémoire" de la base de données qui est effacée lorsque vous fermez l'application.
OriginalL'auteur
Désinstaller votre application à partir de l'émulateur ou le périphérique. Exécutez à nouveau l'application. (OnCreate() n'est pas exécutée lorsque la base de données existe déjà)
OriginalL'auteur
Votre nom de base de données doit se terminer par .db aussi vos chaînes de requête doit avoir une terminaison (;)
OriginalL'auteur
Revérifier votre requête dans ur DatabaseHandler/DatabaseManager classe(qui jamais vous avez pris)
OriginalL'auteur
De base de données Sqlite remplacer deux méthodes
1) onCreate():
Cette méthode invoquée qu'une seule fois lorsque l'application est de commencer à la première fois . Donc il appelé qu'une seule fois
2)onUpgrade()
Cette méthode est appelée lors du changement de la version de base de données,alors cette méthode est appelé.Il est utilisé pour modifier la structure de la table comme l'ajout d'une nouvelle colonne après la création de la DB Schéma
OriginalL'auteur
Sqliteopenhelper de la méthode des méthodes de créer et de mise à niveau,de créer est utilisé lorsqu'une table est la première fois créée et mise à niveau de la méthode sera appelée à chaque fois que chaque fois que le tableau du nombre de colonne est modifiée.
OriginalL'auteur