J'ai créé mes tables dans mon SQLiteOpenHelper
onCreate()
mais je reçois
SQLiteException: no such table
ou
SQLiteException: no such column
les erreurs. Pourquoi?
REMARQUE:
(Ceci est le résumé fusionné de dizaines de questions similaires chaque semaine. Tenter de fournir ici une question / réponse wiki "canonique" de la communauté afin que toutes ces questions puissent être dirigées vers une bonne référence.)
Réponses:
SQLiteOpenHelper
onCreate()
et lesonUpgrade()
rappels sont invoqués lorsque la base de données est réellement ouverte, par exemple par un appel àgetWritableDatabase()
. La base de données n'est pas ouverte lorsque l'objet d'assistance de base de données lui-même est créé.SQLiteOpenHelper
versions les fichiers de base de données. Le numéro de version est l'int
argument transmis au constructeur . Dans le fichier de base de données, le numéro de version est stocké dansPRAGMA user_version
.onCreate()
n'est exécuté que lorsque le fichier de base de données n'existe pas et vient d'être créé. SionCreate()
renvoie avec succès (ne lève pas d'exception), la base de données est supposée être créée avec le numéro de version demandé. En conséquence, vous ne devez pas attraper deSQLException
s enonCreate()
vous-même.onUpgrade()
n'est appelé que lorsque le fichier de base de données existe mais que le numéro de version stocké est inférieur à celui demandé dans le constructeur. leonUpgrade()
doit mettre à jour le schéma de table vers la version demandée.Lors de la modification du schéma de table dans code (
onCreate()
), vous devez vous assurer que la base de données est mise à jour. Deux approches principales:Supprimez l'ancien fichier de base de données afin qu'il
onCreate()
soit à nouveau exécuté. Ceci est souvent préféré au moment du 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ésinstallez l'application. Utilisez le gestionnaire d'application ou à
adb uninstall your.package.name
partir du shell.Effacer les données d'application. Utilisez le gestionnaire d'applications.
Incrémentez la version de la base de données afin qu'elle
onUpgrade()
soit invoquée. C'est un peu plus compliqué car plus de code est nécessaire.Pour les mises à niveau de schéma de temps de développement où la perte de données n'est pas un problème, vous pouvez simplement utiliser
execSQL("DROP TABLE IF EXISTS <tablename>")
in pour supprimer vos tables existantes et appeleronCreate()
pour recréer la base de données.Pour les versions publiées, vous devez implémenter la migration des données
onUpgrade()
afin que vos utilisateurs ne perdent pas leurs données.la source
onUpdate()
, vérifiez chaque ancienne version et effectuez la migration des données appropriée. Et puis, lorsqu'un utilisateur met à jour son application (il a d'anciens fichiers db),onUpgrade
il est déclenché et, si l'utilisateur est nouvellement installé, ilonCreate()
est déclenché.Pour ajouter des points manquants ici, conformément à la demande de Jaskey
La version de la
SQLite
base de données est stockée dans le fichier de base de données.catch est le constructeur
Ainsi, lorsque le constructeur d'aide de base de données est appelé avec un
name
(2e paramètre), la plate-forme vérifie si la base de données existe ou non et si la base de données existe, elle obtient les informations de version à partir de l'en-tête du fichier de base de données et déclenche le bon rappel.Comme déjà expliqué dans la réponse précédente, si la base de données avec le nom n'existe pas, elle se déclenche
onCreate
.L'explication ci-dessous explique
onUpgrade
cas avec un exemple.Disons que votre première version de l'application avait le
DatabaseHelper
(extensionSQLiteOpenHelper
) avec le constructeur passant la version en tant1
que puis vous avez fourni une application mise à niveau avec le nouveau code source ayant la version passée en tant que2
, puis automatiquement lorsque leDatabaseHelper
est construit, la plate-forme se déclencheonUpgrade
en voyant le fichier existe déjà, mais la version est inférieure à la version actuelle que vous avez passée.Supposons maintenant que vous envisagez de fournir une troisième version de l'application avec la version db as
3
(la version db est augmentée uniquement lorsque le schéma de la base de données doit être modifié). Dans de telles mises à niveau incrémentielles, vous devez écrire la logique de mise à niveau de chaque version de manière incrémentielle pour un meilleur code maintenableExemple de pseudo-code ci-dessous:
Notez la
break
déclaration manquante au cas où1
et2
. C'est ce que je veux dire par mise à niveau incrémentielle.Dites si l'ancienne version est
2
et nouvelle version4
, la logique sera mise à jour de la base de données2
à3
puis à4
Si ancienne version est
3
et nouvelle version4
, il suffit d' exécuter la logique de mise à niveau pour3
la4
la source
onCreate()
Lorsque nous créons DataBase pour la première fois (c'est-à-dire que la base de données n'existe pas),
onCreate()
créez une base de données avec la version qui est passée dansSQLiteOpenHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version)
onCreate()
La méthode consiste à créer les tables que vous avez définies et à exécuter tout autre code que vous avez écrit. Cependant, cette méthode ne sera appelée que si le fichier SQLite est manquant dans le répertoire de données de votre application (/data/data/your.apps.classpath/databases
).Cette méthode ne sera pas appelée si vous avez modifié votre code et relancé dans l'émulateur. Si vous souhaitez
onCreate()
exécuter, vous devez utiliser adb pour supprimer le fichier de base de données SQLite.onUpgrade()
SQLiteOpenHelper
devrait appeler le super constructeur.onUpgrade()
méthode ne sera appelée que lorsque l'entier de version est plus grand que la version actuelle exécutée dans l'application.onUpgrade()
méthode soit appelée, vous devez incrémenter le numéro de version dans votre code.la source
Peut-être que je suis trop tard, mais je voudrais partager ma réponse courte et douce. Veuillez cocher Réponse pour un même problème. Il va certainement vous aider. Plus de spécifications détaillées.
Si vous êtes sûr de la syntaxe de création de table, cela peut arriver lorsque vous ajoutez une nouvelle colonne dans votre même table, pour cela ...
1) Désinstallez de votre appareil et exécutez-le à nouveau.
OU
2) Réglage -> application -> ClearData
OU
3) Changement
DATABASE_VERSION
dans votre classe "DatabaseHandler" (Si vous avez ajouté une nouvelle colonne, elle se mettra à jour automatiquement)OU
4) Changement
DATABASE_NAME
dans votre classe "DatabaseHandler" (j'ai rencontré le même problème. Mais je réussis en changeantDATABASE_NAME
.)la source
Points à retenir lors de l'extension
SQLiteOpenHelper
super(context, DBName, null, DBversion);
- Cela devrait être appelé la première ligne du constructeuronCreate
etonUpgrade
(si nécessaire)onCreate
ne sera invoqué que lorsquegetWritableDatabase()
ougetReadableDatabase()
est exécuté. Et cela ne sera invoqué qu'une seule fois lorsqu'unDBName
spécifié dans la première étape n'est pas disponible. Vous pouvez ajouter une requête de création de table suronCreate
méthodeDBversion
et faites les requêtes dans laonUpgrade
table ou désinstallez simplement puis installez l'application.la source
onCreate est appelé pour la première fois lorsque la création de tables est nécessaire. Nous devons remplacer cette méthode où nous écrivons le script de création de table qui est exécuté par SQLiteDatabase. méthode execSQL. Après avoir exécuté lors du premier déploiement, cette méthode ne sera plus appelée.
onUpgrade Cette méthode est appelée lorsque la version de la base de données est mise à niveau. Supposons que pour le premier déploiement, la version de la base de données était 1 et dans le deuxième déploiement, il y a eu un changement dans la structure de la base de données, comme l'ajout d'une colonne supplémentaire dans le tableau. Supposons que la version de la base de données soit 2 maintenant.
la source
Vous pouvez créer une base de données et une table comme
Remarque: si vous souhaitez créer une autre table ou ajouter des colonnes ou aucune table, incrémentez simplement la VERSION
la source
La base de données SQLite remplace deux méthodes
1) onCreate (): Cette méthode n'est invoquée qu'une seule fois lorsque l'application est démarrée pour la première fois. Donc, il n'a appelé qu'une seule fois
2) onUpgrade () Cette méthode appelée lorsque nous changeons la version de la base de données, puis cette méthode est invoquée. Elle est utilisée pour modifier la structure de la table comme l'ajout d'une nouvelle colonne après la création du schéma de base de données.
la source
aucune telle table trouvée ne se trouve principalement lorsque vous n'avez pas ouvert la
SQLiteOpenHelper
classe avecgetwritabledata()
et avant cela, vous devez également appeler le constructeur make avec le nom de la base de données et la version. EtOnUpgrade
est appelé chaque fois qu'il y a une valeur de mise à niveau dans le numéro de version donné enSQLiteOpenHelper
classe.Ci-dessous, l'extrait de code (aucune colonne trouvée ne peut être due à un sort dans le nom de la colonne):
la source
Si vous oubliez de fournir une chaîne "nom" comme deuxième argument au constructeur, il crée une base de données "en mémoire" qui est effacée lorsque vous fermez l'application.
la source
Désinstallez votre application de l'émulateur ou du périphérique. Exécutez à nouveau l'application. (OnCreate () n'est pas exécuté lorsque la base de données existe déjà)
la source
Le nom de votre base de données doit se terminer par .db et vos chaînes de requête doivent avoir un terminateur (;)
la source
Revérifiez votre requête dans votre classe DatabaseHandler / DatabaseManager (que vous ayez jamais prise)
la source
Dans mon cas, je reçois des éléments du fichier XML avec
<string-array>
, où je stocke<item>
s. Dans ces<item>
s, je tiens des chaînes SQL et les applique un par un avecdatabaseBuilder.addMigrations(migration)
. J'ai fait une erreur, j'ai oublié d'ajouter\
avant le devis et j'ai eu l'exception:android.database.sqlite.SQLiteException: aucune colonne de ce type: une_valeur (code 1 SQLITE_ERROR):, lors de la compilation: INSERT INTO nom_table (id, nom) VALEURS (1, une_valeur)
Voici donc une bonne variante:
la source
La méthode de Sqliteopenhelper possède des méthodes de création et de mise à niveau, create est utilisé lors de la première création d'une table et la méthode de mise à niveau est appelée à chaque fois que le nombre de colonnes de la table est modifié.
la source