IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Android Discussion :

Problème SQLite Insert


Sujet :

Android

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2012
    Messages
    277
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2012
    Messages : 277
    Par défaut Problème SQLite Insert
    Bonjour ,

    J'ai un soucis avec ma base de donnée , je cherche à faire une base de donnée , contenant deux tables , une table exercice :
    – id : entier, auto incrémenté et clé primaire
    – name : string, nom de l’exercice
    et une table score :
    – id_exercice : entier, clé étrangère
    – value : entier
    – date : date et heure d’obtention du score

    Hors lorsque j'applique mon code , j'ai le premier insert pour le nom de l'exercice qui fonctionne bien ainsi que le ID , mais pour le Insert du score ça ne fonctionne pas. Et petite question secondaire , comment je peux récupérer la date est l'heure , et quelle est le type de champ (String , format date ? ) dans la base de donnée pour là stocker.

    PS: je ne suis pas sûr de la syntaxe du Insert pour la clé étrangère de la table score ...

    Je vous joins les logs + une partie de mon code :

    Voici les logs :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    11-20 13:38:14.551: E/SQLiteDatabase(721): Error inserting SCORE=20
    11-20 13:38:14.551: E/SQLiteDatabase(721): android.database.sqlite.SQLiteException: no such table: table_score: , while compiling: INSERT INTO table_score(SCORE) VALUES (?)
    11-20 13:38:14.551: E/SQLiteDatabase(721): 	at android.database.sqlite.SQLiteCompiledSql.native_compile(Native Method)
    11-20 13:38:14.551: E/SQLiteDatabase(721): 	at android.database.sqlite.SQLiteCompiledSql.<init>(SQLiteCompiledSql.java:64)
    11-20 13:38:14.551: E/SQLiteDatabase(721): 	at android.database.sqlite.SQLiteProgram.compileSql(SQLiteProgram.java:146)
    11-20 13:38:14.551: E/SQLiteDatabase(721): 	at android.database.sqlite.SQLiteProgram.compileAndbindAllArgs(SQLiteProgram.java:367)
    11-20 13:38:14.551: E/SQLiteDatabase(721): 	at android.database.sqlite.SQLiteStatement.acquireAndLock(SQLiteStatement.java:253)
    11-20 13:38:14.551: E/SQLiteDatabase(721): 	at android.database.sqlite.SQLiteStatement.executeInsert(SQLiteStatement.java:111)
    Voici mon code :

    DataBase :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    package com.example.testbase2;
     
    import android.content.Context;
    import android.database.sqlite.SQLiteDatabase;
    import android.database.sqlite.SQLiteOpenHelper;
    import android.database.sqlite.SQLiteDatabase.CursorFactory;
     
    public class MyDatebase extends SQLiteOpenHelper {
     
    	private static final String TABLE_EXERCICE = "table_exercices";
    	private static final String COL_ID = "ID";
    	private static final String COL_NOM_EXERCICE = "Exercice1";
     
    	private static final String TABLE_SCORE = "table_score";
    	private static final String COL_ID_SCORE = "ID_SCORE";
    	private static final int VALUE = 0;
     
    	private static final String CREATE_BDD = "CREATE TABLE " + TABLE_EXERCICE + " ("
    	+ COL_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, "+ COL_NOM_EXERCICE + " TEXT NOT NULL);";
     
    	private static final String CREATE_BDD2 = "CREATE TABLE " + TABLE_SCORE + " ("
    	+ COL_ID_SCORE + " FOREIGN KEY "+ COL_ID +" REFERENCES, "+ TABLE_EXERCICE + VALUE + "TEXT NOT NULL);";
     
    	public MyDatebase(Context context, String name, CursorFactory factory, int version) {
    		super(context, name, factory, version);
    	}
     
    	@Override
    	public void onCreate(SQLiteDatabase db) {
    		//on crée la table à partir de la requête écrite dans la variable CREATE_BDD
    		db.execSQL(CREATE_BDD);
    		db.execSQL(CREATE_BDD2);
    	}
     
    	@Override
    	public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    		//On peut faire ce qu'on veut ici moi j'ai décidé de supprimer la table et de la recréer
    		//comme ça lorsque je change la version les id repartent de 0
    		db.execSQL("DROP TABLE " + TABLE_EXERCICE + ";");
    		db.execSQL("DROP TABLE " + TABLE_SCORE + ";");
    		onCreate(db);
    	}
     
    }

    ExercicesBDD :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    package com.example.testbase2;
     
    import android.content.ContentValues;
    import android.content.Context;
    import android.database.Cursor;
    import android.database.sqlite.SQLiteDatabase;
     
    public class ExercicesBDD {
     
    	private static final int VERSION_BDD = 1;
    	private static final String NOM_BDD = "exercices1.db";
     
    	private static final String TABLE_EXERCICE = "table_exercices";
    	private static final String TABLE_SCORE = "table_score";
    	private static final int NUM_COL_ID_SCORE = 0;
    	private static final String COL_ID_SCORE = "ID_SCORE";
    	private static final int NUM_COL_SCORE = 1;
    	private static final String COL_NOM_SCORE = "SCORE";
    	private static final int VALUE = 0;
     
    	private static final String COL_ID = "ID";
    	private static final int NUM_COL_ID = 0;
    	private static final String COL_NOM_EXERCICE = "Exercice1";
    	private static final int NUM_COL_TITRE = 1;
     
    	private SQLiteDatabase bdd;
     
    	private MyDatebase maBaseSQLite;
     
    	public ExercicesBDD(Context context){
    		//On crée la BDD et sa table
    		maBaseSQLite = new MyDatebase(context, NOM_BDD, null, VERSION_BDD);
    	}
     
    	public void open(){
    		//on ouvre la BDD en écriture
    		bdd = maBaseSQLite.getWritableDatabase();
    	}
     
    	public void close(){
    		//on ferme l'accès à la BDD
    		bdd.close();
    	}
     
    	public SQLiteDatabase getBDD(){
    		return bdd;
    	}
     
    	public long insertExercice(Exercice exercice){
    		//Création d'un ContentValues (fonctionne comme une HashMap)
    		ContentValues values = new ContentValues();
    		//on lui ajoute une valeur associée à une clé (qui est le nom de la colonne dans laquelle on veut mettre la valeur)
    		values.put(COL_NOM_EXERCICE, exercice.getTitre());
    		System.out.println("insertion du nom d'exercice en base");
    		//on insère l'objet dans la BDD via le ContentValues
     
    		return bdd.insert(TABLE_EXERCICE, null, values);
    	}
     
    	public long insertExercice2(Exercice exercice){
    		ContentValues values2 = new ContentValues();
    		values2.put(COL_NOM_SCORE, exercice.getValue());
    		System.out.println("insertion du score en base");
    		return bdd.insert(TABLE_SCORE, null, values2);
    	}
     
    	public int updateExercice(int id, Exercice exercice){
    		//La mise à jour de l'exercice dans la BDD fonctionne plus ou moins comme une insertion
    		//il faut simplement préciser quel exercice on doit mettre à jour grâce à l'ID
    		ContentValues values = new ContentValues();
    		values.put(COL_NOM_EXERCICE, exercice.getTitre());
    		return bdd.update(TABLE_EXERCICE, values, COL_ID + " = " +id, null);
    	}
     
    	public int removeExerciceWithID(int id){
    		//Suppression d'un exercice de la BDD grâce à l'ID
    		return bdd.delete(TABLE_EXERCICE, COL_ID + " = " +id, null);
    	}
     
    	public Exercice getExerciceWithNom(String titre){
    		//Récupère dans un Cursor les valeurs correspondant à un exercice contenu dans la BDD (ici on sélectionne l'exercice grâce à son titre)
    		Cursor c = bdd.query(TABLE_EXERCICE, new String[] {COL_ID, COL_NOM_EXERCICE}, COL_NOM_EXERCICE + " LIKE \"" + titre +"\"", null, null, null, null);
    		return cursorToLivre(c);
    	}
     
    	//Cette méthode permet de convertir un cursor en un exercice
    	private Exercice cursorToLivre(Cursor c){
    		//si aucun élément n'a été retourné dans la requête, on renvoie null
    		if (c.getCount() == 0)
    			return null;
     
    		//Sinon on se place sur le premier élément
    		c.moveToFirst();
    		//On créé un exercice
    		Exercice exercice = new Exercice();
    		//on lui affecte toutes les infos grâce aux infos contenues dans le Cursor
    		exercice.setId(c.getInt(NUM_COL_ID));
    		exercice.setNom(c.getString(NUM_COL_TITRE));
    		exercice.setValue(c.getInt(NUM_COL_SCORE));
    		//On ferme le cursor
    		c.close();
     
    		//On retourne l'exercice
    		return exercice;
    	}
    }

  2. #2
    Rédacteur
    Avatar de David55
    Homme Profil pro
    Ingénieur informatique
    Inscrit en
    Août 2010
    Messages
    1 542
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2010
    Messages : 1 542
    Par défaut
    Bonjour,

    no such table: table_score
    Ta table existe bien à mon avis. Par contre, cette table contient qu'un seul champ qui est ID_SCORE. Tu ne parle jamais de la colonne SCORE dans la création de ta table :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    private static final String CREATE_BDD2 = "CREATE TABLE " + TABLE_SCORE + " ("
    	+ COL_ID_SCORE + " FOREIGN KEY "+ COL_ID +" REFERENCES, "+ TABLE_EXERCICE + VALUE + "TEXT NOT NULL);";
    Aussi, tu as certainement des erreurs de syntaxe dans tes requêtes SQL.


    Affiches tes requêtes lors de ces exécutions et on verra bien

  3. #3
    Membre éclairé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2012
    Messages
    277
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2012
    Messages : 277
    Par défaut
    Salut et merci pour te réponse , la colonne score est bien là , le champ qui contient la valeur du score à pour nom "value" et un ID_score. Donc je ne comprends pas pourquoi ça ne passe pas.

  4. #4
    Membre éclairé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2012
    Messages
    277
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2012
    Messages : 277
    Par défaut
    j'ai essayer en faisant cela :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    	private static final String CREATE_BDD = 
    	"CREATE TABLE " + TABLE_EXERCICE + 
    	" ("+ COL_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, "
    		+ COL_NOM_EXERCICE + " TEXT NOT NULL);";
     
    //requete posant probleme ...
     
    	private static final String CREATE_BDD2 = 
    	"CREATE TABLE " + TABLE_SCORE + 
    	" ("+ COL_ID_SCORE + " FOREIGN KEY ("+COL_ID_SCORE+") REFERENCES "+ TABLE_EXERCICE +" ("+COL_NOM_SCORE+") + "+VALUE+" + INTEGER);";
    J'ai toujours une erreur sur le Insert Score pouvez vous me dire si je ne respect pas la syntaxe svp

  5. #5
    Membre chevronné

    Profil pro
    Inscrit en
    Février 2008
    Messages
    658
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 658
    Par défaut
    Effectivement ta table table_score n'existait pas car elle n'etait pas créée.

    Simplement par ce que ton col_id_score n'etait pas un champ dans la table table_score...

    Essaye de bien placer les guillemments à leur place...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    "CREATE TABLE  TABLE_SCORE  (
    COL_ID_SCORE INTEGER,
    VALUE   INTEGER,
    FOREIGN KEY (COL_ID_SCORE) REFERENCES  TABLE_EXERCICE (COL_NOM_SCORE))";

  6. #6
    Membre éclairé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2012
    Messages
    277
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2012
    Messages : 277
    Par défaut
    Je ne comprends pas pourquoi tu mets en reference le COL_NOM_SCORE , pourquoi pas mettre le COL_ID_SCORE à la place ?

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème d'insertion dans une table, SQLite
    Par syrine Jerbi dans le forum Android
    Réponses: 1
    Dernier message: 18/02/2014, 11h36
  2. Probléme d'insertion par défault
    Par xavier62 dans le forum SQL
    Réponses: 7
    Dernier message: 28/11/2003, 13h03
  3. [Interbase 7] Problème d'insertion de données
    Par Tuscelan dans le forum InterBase
    Réponses: 12
    Dernier message: 19/11/2003, 22h58
  4. STL : std::set problème avec insert ...
    Par Big K. dans le forum MFC
    Réponses: 13
    Dernier message: 08/11/2003, 01h02
  5. Problème d'insertion avec MySQL
    Par Sonny dans le forum ASP
    Réponses: 13
    Dernier message: 28/08/2003, 13h52

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo