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 :

Select avec jointure via SQLite


Sujet :

Android

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Collégien
    Inscrit en
    Juin 2013
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Collégien

    Informations forums :
    Inscription : Juin 2013
    Messages : 26
    Par défaut Select avec jointure via SQLite
    Bonjour,

    Je souhaite faire un SELECT avec jointure, mais le logCat me renvoi
    " java.lang.NullPointerException ".

    Voici le code de mon IHM:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    //ouverture de la BDD
    db = new DBAdapter(getApplicationContext());
    //idUtilisateur  = 1
    cursor = db.SelectCompteUtilisateur(idUtilisateur);
    Maintenant le code pour la persistance :
    Le but de mon select est de me retourner une liste de compte d'un utilisateur par rapport a son ID.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    String Query = " SELECT * FROM "+ BDD.TABLE_COMPTES + " C INNER JOIN " + BDD.TABLE_UTILISATEURS + " U ON C.COL_ID_UTILISATEUR = U.COL_ID " + " WHERE U.COL_ID =   " + idUtilisateur;
    Cursor cursor = db.rawQuery(Query,null);
    //je contrôle si mon cursor est null, mais le code plante avant.
    if(cursor == null || cursor.getCount() == 0)
    System.out.println(null);
    et voici le code de mes deux tables pour la BDD, avec clef étrangère pour faire la liaison :

    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
     
    "CREATE TABLE " + TABLE_UTILISATEURS + " (" +
        		        "COL_ID INTEGER PRIMARY KEY, " +
        		        "COL_NOM TEXT NOT NULL, " +
    		        "COL_PASSWORD TEXT NOT NULL, " +
        		        "COL_MAIL TEXT NOT NULL, " + 
    			"COL_ETAT INTEGER NOT NULL);" +
     
    " CREATE TABLE " + TABLE_COMPTES + " (" + 
    			"COL_ID_COMPTE INTEGER PRIMARY KEY AUTOINCREMENT, " + 
    			"COL_ID_UTILISATEUR INTEGER NOT NULL CONSTRAINT fk_utilisateurs_comptes REFERENCES"+ TABLE_UTILISATEURS +  "(COL_ID)," +
    		        "COL_BANK TEXT NULL,"+
    			"COL_TITRE TEXT NOT NULL," + 
    			"COL_DESIGNATION TEXT NULL," + 
    		        "COL_SELECT INTEGER NULL,"+
    			"COL_TOTAL REAL NULL);" +
    merci pour votre aide.

  2. #2
    Modérateur
    Avatar de grunk
    Homme Profil pro
    Lead dév - Architecte
    Inscrit en
    Août 2003
    Messages
    6 693
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Lead dév - Architecte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2003
    Messages : 6 693
    Par défaut
    As tu essayé d'activier les clé étrangères avant les requêtes ? :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    db.execSQL("PRAGMA foreign_keys=ON");
    Pry Framework php5 | N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre averti
    Homme Profil pro
    Collégien
    Inscrit en
    Juin 2013
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Collégien

    Informations forums :
    Inscription : Juin 2013
    Messages : 26
    Par défaut
    Oui à chaque ouverture de ma BDD

  4. #4
    Expert confirmé

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Billets dans le blog
    3
    Par défaut
    On pourrait avoir la stacktrace complete de l'exception ?

    P.S.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    private static final String query = " SELECT * FROM "+ BDD.TABLE_COMPTES + " C INNER JOIN " + BDD.TABLE_UTILISATEURS + " U ON C.COL_ID_UTILISATEUR = U.COL_ID " + " WHERE U.COL_ID =  ?";
    Cursor cursor = db.rawQuery(query,new String[] { idUtilisateur });
    Ca permet à la base d'optimiser ses query (et de conserver des prepared statements).

  5. #5
    Membre averti
    Homme Profil pro
    Collégien
    Inscrit en
    Juin 2013
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Collégien

    Informations forums :
    Inscription : Juin 2013
    Messages : 26
    Par défaut
    Alors en faite j'ai un peut avancé dans mon problème, maintenant le LogCat m'indique qu'il ne trouve pas ma table "table_compte", pour info je suis toujours dans la méthode avec la requête SELECT.

    Voici le logCat :
    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
     
    08-09 22:07:43.472: W/KeyCharacterMap(228): No keyboard for id 0
    08-09 22:07:43.482: W/KeyCharacterMap(228): Using default keymap: /system/usr/keychars/qwerty.kcm.bin
    08-09 22:08:13.732: I/System.out(228): lescomptes : 1
    08-09 22:08:13.732: D/AndroidRuntime(228): Shutting down VM
    08-09 22:08:13.742: W/dalvikvm(228): threadid=3: thread exiting with uncaught exception (group=0x4001b188)
    08-09 22:08:13.742: E/AndroidRuntime(228): Uncaught handler: thread main exiting due to uncaught exception
    08-09 22:08:13.752: E/AndroidRuntime(228): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.virtualbudget/com.virtualbudget.LesComptes}: android.database.sqlite.SQLiteException: no such table: TABLE_COMPTES: , while compiling:  SELECT * FROM  TABLE_COMPTES  AS C INNER JOIN TABLE_UTILISATEURS AS U ON C.COL_ID_UTILISATEUR = U.COL_ID  WHERE U.COL_ID = 1
    08-09 22:08:13.752: E/AndroidRuntime(228): 	at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2496)
    08-09 22:08:13.752: E/AndroidRuntime(228): 	at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2512)
    08-09 22:08:13.752: E/AndroidRuntime(228): 	at android.app.ActivityThread.access$2200(ActivityThread.java:119)
    08-09 22:08:13.752: E/AndroidRuntime(228): 	at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1863)
    08-09 22:08:13.752: E/AndroidRuntime(228): 	at android.os.Handler.dispatchMessage(Handler.java:99)
    08-09 22:08:13.752: E/AndroidRuntime(228): 	at android.os.Looper.loop(Looper.java:123)
    08-09 22:08:13.752: E/AndroidRuntime(228): 	at android.app.ActivityThread.main(ActivityThread.java:4363)
    08-09 22:08:13.752: E/AndroidRuntime(228): 	at java.lang.reflect.Method.invokeNative(Native Method)
    08-09 22:08:13.752: E/AndroidRuntime(228): 	at java.lang.reflect.Method.invoke(Method.java:521)
    08-09 22:08:13.752: E/AndroidRuntime(228): 	at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860)
    08-09 22:08:13.752: E/AndroidRuntime(228): 	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
    08-09 22:08:13.752: E/AndroidRuntime(228): 	at dalvik.system.NativeStart.main(Native Method)
    08-09 22:08:13.752: E/AndroidRuntime(228): Caused by: android.database.sqlite.SQLiteException: no such table: TABLE_COMPTES: , while compiling:  SELECT * FROM  TABLE_COMPTES  AS C INNER JOIN TABLE_UTILISATEURS AS U ON C.COL_ID_UTILISATEUR = U.COL_ID  WHERE U.COL_ID = 1
    08-09 22:08:13.752: E/AndroidRuntime(228): 	at android.database.sqlite.SQLiteProgram.native_compile(Native Method)
    08-09 22:08:13.752: E/AndroidRuntime(228): 	at android.database.sqlite.SQLiteProgram.compile(SQLiteProgram.java:110)
    08-09 22:08:13.752: E/AndroidRuntime(228): 	at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:59)
    08-09 22:08:13.752: E/AndroidRuntime(228): 	at android.database.sqlite.SQLiteQuery.<init>(SQLiteQuery.java:49)
    08-09 22:08:13.752: E/AndroidRuntime(228): 	at android.database.sqlite.SQLiteDirectCursorDriver.query(SQLiteDirectCursorDriver.java:49)
    08-09 22:08:13.752: E/AndroidRuntime(228): 	at android.database.sqlite.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java:1221)
    08-09 22:08:13.752: E/AndroidRuntime(228): 	at android.database.sqlite.SQLiteDatabase.rawQuery(SQLiteDatabase.java:1194)
    08-09 22:08:13.752: E/AndroidRuntime(228): 	at Persistance.DBAdapter.SelectCompteUtilisateur(DBAdapter.java:191)
    08-09 22:08:13.752: E/AndroidRuntime(228): 	at com.virtualbudget.LesComptes.onCreate(LesComptes.java:69)
    08-09 22:08:13.752: E/AndroidRuntime(228): 	at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
    08-09 22:08:13.752: E/AndroidRuntime(228): 	at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2459)
    08-09 22:08:13.752: E/AndroidRuntime(228): 	... 11 more
    08-09 22:08:13.805: I/dalvikvm(228): threadid=7: reacting to signal 3
    08-09 22:08:13.812: I/dalvikvm(228): Wrote stack trace to '/data/anr/traces.txt'
    08-09 22:13:13.867: I/Process(228): Sending signal. PID: 228 SIG: 9
    Et ma classe pour la BDD :
    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
     
    public class BDD extends SQLiteOpenHelper {
     
    	private static final String TAG = "BDD";
    	private static final String DATABASE_NAME = "VirtualBudget";
    	private static final int DATA_VERSION = 1;
     
     
    	public static final String TABLE_UTILISATEURS = "TABLE_UTILISATEURS";
    	public static final String TABLE_COMPTES = " TABLE_COMPTES ";
    	public static final String TABLE_TRANSACTIONS = "TABLE_TRANSACTIONS";
     
        private static final String CREATE_BDD =
     
        		        "CREATE TABLE " + TABLE_UTILISATEURS + " (" +
        		        "COL_ID INTEGER PRIMARY KEY, " +
        		        "COL_NOM TEXT NOT NULL, " +
    					"COL_PASSWORD TEXT NOT NULL, " +
        		        "COL_MAIL TEXT NOT NULL, " + 
    					"COL_ETAT INTEGER NOT NULL);" +
     
    					" CREATE TABLE " + TABLE_COMPTES + " (" + 
    					"COL_ID_COMPTE INTEGER PRIMARY KEY AUTOINCREMENT, " + 
    					"COL_ID_UTILISATEUR INTEGER NOT NULL CONSTRAINT fk_utilisateurs_comptes REFERENCES "+ TABLE_UTILISATEURS +  "(COL_ID)," +
    					"COL_BANK TEXT NULL,"+
    					"COL_TITRE TEXT NOT NULL," + 
    					"COL_DESIGNATION TEXT NULL," + 
    					"COL_SELECT INTEGER NULL,"+
    					"COL_TOTAL REAL NULL);" +
     
    					"CREATE TABLE" + TABLE_TRANSACTIONS + " (" +
    					"COL_IDTRANSACTION INTEGER PRIMARY KEY AUTOINCREMENT " + 
    					"COL_IDCOMPTE INTEGER NOT NULL CONSTRAINT fk_comptes_transactions REFERENCES " + TABLE_COMPTES + "(COL_ID_COMPTE)," +
    					"COL_LIBELLE TEXT NULL," +
    					"COL_MONTANT REAL NULL," + 
    					"COL_DATE DATE NULL," + 
    					"COL_FIXE INTEGER NULL," + 
    					"COL_DEBIT INTEGER NULL," +
    					"COL_CREDIT INTEGER NULL );";
     
                         public BDD(Context context) {
    		             super(context,DATABASE_NAME, null, DATA_VERSION);
    	                  }
     
     
    					@Override
    					public void onCreate(SQLiteDatabase db) {
    						//on créé la table à partir de la requête écrite dans la variable CREATE_BDD
     
    						db.execSQL(CREATE_BDD);
     
    					}
     
    				    @Override
    					public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    						//On peut fait 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
    						Log.w(TAG, "UPGRADING DATABASE FROM VERSION " 
    						+ oldVersion + " TO " + newVersion + ", WHICH WILL DESTROY ALL OLD DATA !"); 
    						db.execSQL("DROP DATABASE IF EXISTS " + CREATE_BDD + ";");
     
    						onCreate(db);
    					}
     
    				}
    Et encore une fois merci pour votre aide ! étant novice, c'est franchement pas évident....

  6. #6
    Expert confirmé

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Billets dans le blog
    3
    Par défaut
    1. tu ne nous a pas dit la résolution du problème initial (je penchais pour un bd à null mais bon...).

    2. Tout est dit: la table TABLE_COMPTES n'existe pas dans la base de données...

    3. Faire une requête par création de table dans la construction de la DB... et à chaque fois le logger avec un joli "Log.i"... cela évite grandement les problèmes de debug.

    Mon avis de loin avec le peu d'information:
    Tu as rajouté la table TABLE_COMPTES, mais oublié de:
    • Désinstaller l'application avant de l’exécuter à nouveau.
    • Incrémenter le numéro de version de la base de données (donc pas de passage dans le onUpgrade)

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

Discussions similaires

  1. Requete SELECT avec jointures
    Par escteban dans le forum Requêtes
    Réponses: 10
    Dernier message: 18/04/2007, 12h16
  2. [HQL] Select avec jointure
    Par jeoff dans le forum Hibernate
    Réponses: 1
    Dernier message: 07/11/2006, 12h12
  3. [c#]commande Select avec jointure de deux tables
    Par chorokari dans le forum Accès aux données
    Réponses: 6
    Dernier message: 18/10/2006, 14h47
  4. Delete + selection avec jointure
    Par kluh dans le forum Oracle
    Réponses: 4
    Dernier message: 15/11/2005, 10h44
  5. Problème performance SELECT avec jointure
    Par Netgamer dans le forum Requêtes
    Réponses: 7
    Dernier message: 05/08/2005, 10h20

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