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

  1. #1
    Nouveau membre du Club
    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
    Points : 25
    Points
    25
    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 691
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Côte d'Or (Bourgogne)

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

    Informations forums :
    Inscription : Août 2003
    Messages : 6 691
    Points : 20 222
    Points
    20 222
    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
    Nouveau membre du Club
    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
    Points : 25
    Points
    25
    Par défaut
    Oui à chaque ouverture de ma BDD

  4. #4
    Expert éminent

    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
    Points : 7 618
    Points
    7 618
    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).
    N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
    Et surtout

  5. #5
    Nouveau membre du Club
    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
    Points : 25
    Points
    25
    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 éminent

    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
    Points : 7 618
    Points
    7 618
    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)
    N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
    Et surtout

  7. #7
    Nouveau membre du Club
    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
    Points : 25
    Points
    25
    Par défaut
    Pour le problème précédent, il a fallut que je rajoute "db.open" dans mon IHM. Pour mes autres IHM je ne l'avais pas fait et pourtant mes "SELECT" fonctionné.... (j'avais juste a faire "db = new DBAdapter(getApplicationContext()); ") je m'étais aidé du tuto sur le site Troll Me.

    Sinon pour ma base de donnée, j'ai séparé mes tables par des variables et lors de la création de la base cela ma permis de constater qu'il y avait des fautes dans mes requêtes et du coup ma table COMPTE n'était pas créé.

    Merci pour votre aide !

  8. #8
    Inscrit

    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
    Points : 892
    Points
    892
    Par défaut
    Je sais pas mais dans mon experience de developpement sur mobile, je me suis jamais cassé la tete à strucuturer extremement la base de données...
    Je sais pas qu'est ce que vous en pensez mais une application mobile n'a pas besoin une base trop structuré....

  9. #9
    Expert éminent

    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
    Points : 7 618
    Points
    7 618
    Billets dans le blog
    3
    Par défaut
    Chacun ses besoins...

    Les referential integrity sont aussi un bon garde-fou contre les bugs applicatifs éventuels... Comme la donnée est ce qu'il y a de plus important ....
    Après, elle n'est pas nécessaire pour les jointures, (tant qu'il y a un index ^^)
    N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
    Et surtout

+ 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