Partage
  • Partager sur Facebook
  • Partager sur Twitter

[Android] Jeu question/réponse - Comment m'y prendre?

    27 juillet 2012 à 10:03:33

    Ah Fumble, yavait longtemps :p

    Une NPE tu dis?c'est a dire?
    La ligne 45 renvoie à la ligne questionsBdd.open();
    • Partager sur Facebook
    • Partager sur Twitter
      27 juillet 2012 à 10:08:51

      NullPointerException. C'est écrit dans le LogCat.

      Est-ce que ta variable questionBdd est bien initialisée?

      • Partager sur Facebook
      • Partager sur Twitter
        27 juillet 2012 à 10:13:31

        Ma classe ImportCSVToBDD est affichée en page1, et c'est l'activity qui est lancée au démarrage de mon appli. Pourtant, dans mon onCreate j'ai bien questionsBdd.open() et questionsBdd.close(), et je n'ai pas de message d'erreur...
        • Partager sur Facebook
        • Partager sur Twitter
          27 juillet 2012 à 10:20:38

          En regardant tes précédents messages, je vois que tu fait un new ImportCSVToBDD(); Or cette classe est une Activity !!!
          On ne peut donc pas l'instancier comme une classe classique. Tu es obligé de la lancer comme une Activity. C'est-à-dire via startActivity().
          • Partager sur Facebook
          • Partager sur Twitter
            27 juillet 2012 à 10:28:47

            Comment dois-je m'y prendre pour utiliser ma méthode insertQ&R alors?
            De plus, si je retire le open() et close() de mon onCreate(), mais que je le laisse dans insertQ&R(), je n'ai plus d'erreur...

            EDIT : Logique, puisque sans le open(), ma bdd n'est plus créée, et ma méthode insertQ&R n'est jamais appelée.
            • Partager sur Facebook
            • Partager sur Twitter
              27 juillet 2012 à 10:41:00

              Fais une classe à part qui gère ta BdD.
              Comme ça, tu sépares l'accès aux données de la vue.
              • Partager sur Facebook
              • Partager sur Twitter
                27 juillet 2012 à 10:47:15

                C'est ce que j'ai fais, j'ai 3 classes qui permettent de gérer ma BDD. Je me suis inspiré de ce tuto :

                http://www.tutomobile.fr/comment-utili [...] 9/19/10/2010/

                Ma classe ImportCSVToBDD est lancé au démarrage de mon appli et me sert juste a remplir ma table avec le contenu d'un fichier CSV, une fois cette table remplie, j'appelle mon activity qui me sert de "page d'accueil"
                • Partager sur Facebook
                • Partager sur Twitter
                  27 juillet 2012 à 10:52:29

                  Non pas à la ligne 45 mais 30 de ImportCSVtoBDD
                  • Partager sur Facebook
                  • Partager sur Twitter
                    27 juillet 2012 à 10:56:49

                    Ouais ligne 30. J'avais loupé ça.
                    Pourrais-tu poster tes fichiers de façon complète histoire qu'on ait la correspondance erreur/code?
                    • Partager sur Facebook
                    • Partager sur Twitter
                      27 juillet 2012 à 11:37:05

                      Voici ma classe ImportCSVToBDD :

                      package com.android.tutoquestionreponse;
                      
                      import java.io.BufferedReader;
                      import java.io.IOException;
                      import java.io.InputStream;
                      import java.io.InputStreamReader;
                      import java.util.ArrayList;
                      import java.util.StringTokenizer;
                      
                      import android.app.Activity;
                      import android.content.ContentValues;
                      import android.content.Context;
                      import android.content.Intent;
                      import android.os.Bundle;
                      import android.widget.TextView;
                      
                      public class ImportCSVToBDD extends Activity {
                      	
                      	private QuestionsBDD questionsBdd;
                      	private Context ctx;
                      	
                      	
                      	@Override
                          public void onCreate(Bundle savedInstanceState) {
                              super.onCreate(savedInstanceState);
                              setContentView(R.layout.activity_main);
                      
                              //Création d'une instance de ma classe QuestionsBDD
                              questionsBdd = new QuestionsBDD(this);
                              ctx = this;
                              questionsBdd.open();
                      		 
                      		 
                              
                      		 	
                      		
                      	
                      	
                              questionsBdd.close();
                      		Intent i = new Intent(this, MainActivity.class);
                      		startActivity(i);
                      	}
                      	
                      	public void insertQandR(){
                      		ContentValues values;
                      		questionsBdd.open();
                      
                      		try {
                      			InputStream file= ctx.getAssets().open("Q&R.csv");
                      			InputStreamReader FileReader= new InputStreamReader(file);
                      			BufferedReader r = new BufferedReader(FileReader);
                      			String line = null;
                      			String value = null;
                      			ArrayList<String> dataRow;
                      			StringTokenizer token;
                      			while((line=r.readLine())!=null) {
                      				values= new ContentValues();
                      				dataRow = new ArrayList<String>();
                      				token = new StringTokenizer(line, ";");
                      				while(token.hasMoreElements()) {
                      					value = (String) token.nextElement();
                      					dataRow.add(value);
                      				}
                      					
                      		//cette partie de code est à repeter pour chaque colonne
                      		values.put("Q1", dataRow.get(0));
                      		values.put("R1", dataRow.get(1));
                      		values.put("R2", dataRow.get(2));
                      		values.put("R3", dataRow.get(3));
                      		values.put("R4", dataRow.get(4));
                      		values.put("BR", dataRow.get(5));
                      		
                      						
                      		questionsBdd.getBDD().insert("questions.db", null, values);
                      		
                      			}
                      				 
                      		}
                      	catch (IOException e) {
                      				
                      	e.printStackTrace();
                      		}
                      	questionsBdd.close();
                      
                      	}
                      }
                      


                      Si c'est à la ligne 30, ca viendrait de mon "ctx=this" apperemment
                      • Partager sur Facebook
                      • Partager sur Twitter
                        29 juillet 2012 à 22:37:09

                        Bonsoir,

                        je me permets de up ce sujet. Vous souhaitez peut être que je mette l'ensemble des fichiers du projet?
                        • Partager sur Facebook
                        • Partager sur Twitter
                          30 juillet 2012 à 10:19:09

                          Je te conseille de supprimer ctx et de le remplacer par ImportCSVToBDD.this
                          • Partager sur Facebook
                          • Partager sur Twitter
                            30 juillet 2012 à 18:47:54

                            En mettant donc "ImportCSVToBDD.this=this"?
                            • Partager sur Facebook
                            • Partager sur Twitter
                              30 juillet 2012 à 18:59:03

                              Citation : Gnaag

                              En mettant donc "ImportCSVToBDD.this=this"?


                              ImportCSVToBDD.this n'est pas une variable. Tu ne peux donc pas lui assigner une valeur.

                              Et dans un cas plus général, cela reviendrait à faire un truc de la sorte:
                              int i = 0;
                              i = i;
                              

                              Très utile...
                              • Partager sur Facebook
                              • Partager sur Twitter
                                30 juillet 2012 à 20:12:17

                                ctx.getAssets().open("Q&R.csv")
                                ru le remplace par ca
                                ImportCSVToBDD.this.getAssets().open("Q&R.csv")
                                • Partager sur Facebook
                                • Partager sur Twitter
                                  30 juillet 2012 à 21:09:35

                                  ah oui d'accord, j'avais oublié qu'il était présent la aussi, j'avais regardé avec un smartphone en 3G donc bon, jsuis passé a coté. Je vois ça dés que j'arrive chez moi ! Merci pour votre aide :)
                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    31 juillet 2012 à 21:39:39

                                    Tiens c'est bizare, j'ai essayé de débugger mon programme en y mettant des points d'arrêts, mais en mode débugage, l'application ne s'érrêtait pas dessus, j'ai donc réinstaller eclipse ainsi que le SDK. Résultat, je n'ai plus d'erreur dans mon appli... Je ne comprends vraiment pas.

                                    Maintenant j'aimerais vérifier que mes données sont bien enregistrées dans la BDD, j'ai donc mis ce morceau de code dans mon main afin d'essayer de récupérer une question enregistrée dans la BDD, mais sans résultat. Le voici :

                                    package com.android.tutoquestionreponse;
                                    
                                    import android.os.Bundle;
                                    import android.app.Activity;
                                    import android.view.Menu;
                                    import android.widget.TextView;
                                    import android.widget.Toast;
                                    
                                    public class MainActivity extends Activity {
                                    
                                        @Override
                                        public void onCreate(Bundle savedInstanceState) {
                                            super.onCreate(savedInstanceState);
                                            setContentView(R.layout.activity_main);
                                            
                                            //Récupération d'une question enregistrée dans la BDD
                                            QuestionsBDD questionsBdd = new QuestionsBDD(this);
                                            questionsBdd.open();
                                            Questions questionFromBdd = questionsBdd.getQuestionWithID(1);
                                            String test = questionFromBdd.getQuestion().toString();
                                            questionsBdd.close();
                                            Toast.makeText(this, test, Toast.LENGTH_LONG).show();
                                        }
                                    	
                                        @Override
                                        public boolean onCreateOptionsMenu(Menu menu) {
                                            getMenuInflater().inflate(R.menu.activity_main, menu);
                                            return true;
                                        }    
                                    }
                                    


                                    Mais j'obtiens un message d'erreur NullPointerException sur la ligne :"String test = questionFromBdd.getQuestion().toString();"

                                    Les données n'ont donc pas l'air d'être enregistrées. Y a t-il un moyen de le vérifier?

                                    EDIT : Je viens de désinstaller mon appli de l'AVD, et j'ai à nouveau le message NullPointerException de départ. En fait, si je désinstalle mon appli, que je ne fais pas l'appel de la méthode insertQandR()(en les mettant en commentaire) de ma classe ImportCSVToBDD dans le onCreate et le onUpgrade de ma classe MaBaseSQLite(qui extends de SQLiteOpenHelper), et qu'ensuite seulement je relance mon appli aprés avoir enlevé les commentaires précédemment mis, la je n'ai pas d'erreur. Je pense que le problème survient uniquement tant que mon appli ne s'est pas lancé correctement une première fois, et donc que le problème vient de la création de la base/table, puisqu'après avoir lancé correctement (sans erreur) mon appli, la l'ensemble de mon code ne fais pas crash mon appli, mais j'ai l'impression que les données contenues dans mon fichier .csv ne s'enregistrent pas dans la base de données...
                                    Souhaitez vous que je vous mette l'ensemble de mes classes? J'espère ne pas avoir été trop flou dans mon explication...
                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                      1 août 2012 à 17:21:08

                                      Oui ce serait préférable de tout voir :)
                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                        2 août 2012 à 12:30:36

                                        Bonjour, et merci pour ta réponse :)

                                        Voici donc mes classes :

                                        Classe ImportCSVToBDD qui extends d'Activity et qui me permets de créer/remplir ma BDD à l'aide d'un fichier .csv :
                                        package com.android.tutoquestionreponse;
                                        
                                        import java.io.BufferedReader;
                                        import java.io.IOException;
                                        import java.io.InputStream;
                                        import java.io.InputStreamReader;
                                        import java.util.ArrayList;
                                        import java.util.StringTokenizer;
                                        import android.app.Activity;
                                        import android.content.ContentValues;
                                        import android.content.Context;
                                        import android.content.Intent;
                                        import android.os.Bundle;
                                        
                                        public class ImportCSVToBDD extends Activity {
                                        	
                                        	private QuestionsBDD questionsBdd;
                                        	private Context ctx;
                                        	
                                        	
                                        	@Override
                                            public void onCreate(Bundle savedInstanceState) {
                                                super.onCreate(savedInstanceState);
                                                setContentView(R.layout.activity_main);
                                        
                                                //Création d'une instance de ma classe QuestionsBDD
                                                questionsBdd = new QuestionsBDD(this);
                                                ctx = this;
                                                questionsBdd.open();
                                                questionsBdd.close();
                                                Intent i = new Intent(this, MainActivity.class);
                                        		startActivity(i);		
                                        	}
                                        	
                                        	public void insertQandR(){
                                        		ContentValues values;
                                        		questionsBdd.open();
                                        		try {
                                        			InputStream file= ctx.getAssets().open("QandR.csv");
                                        			InputStreamReader FileReader= new InputStreamReader(file);
                                        			BufferedReader r = new BufferedReader(FileReader);
                                        			String line = null;
                                        			String value = null;
                                        			ArrayList<String> dataRow;
                                        			StringTokenizer token;
                                        			while((line=r.readLine())!=null) {
                                        				values= new ContentValues();
                                        				dataRow = new ArrayList<String>();
                                        				token = new StringTokenizer(line, ";");
                                        				while(token.hasMoreElements()) {
                                        					value = (String) token.nextElement();
                                        					dataRow.add(value);
                                        				}
                                        		//cette partie de code est à repeter pour chaque colonne
                                        		values.put("Q1", dataRow.get(0));
                                        		values.put("R1", dataRow.get(1));
                                        		values.put("R2", dataRow.get(2));
                                        		values.put("R3", dataRow.get(3));
                                        		values.put("R4", dataRow.get(4));
                                        		values.put("BR", dataRow.get(5));				
                                        		questionsBdd.getBDD().insert("questions.db", null, values);
                                        			}				 
                                        		}
                                        	catch (IOException e) {
                                        	e.printStackTrace();
                                        		}
                                        	questionsBdd.close();
                                        	}
                                        }
                                        


                                        Une fois ma BDD créée/remplie, j'appelle ma classe MainActivity qui extends d'Activity et qui me sert de page d'accueil pour mon appli(Avec bouton "Jouer", "Paramètres", etc...) et sur laquelle je test actuellement la récupération d'un enregistrement pour me l'afficher :

                                        package com.android.tutoquestionreponse;
                                        
                                        import android.os.Bundle;
                                        import android.app.Activity;
                                        import android.view.Menu;
                                        import android.widget.TextView;
                                        import android.widget.Toast;
                                        
                                        public class MainActivity extends Activity {
                                        
                                            @Override
                                            public void onCreate(Bundle savedInstanceState) {
                                                super.onCreate(savedInstanceState);
                                                setContentView(R.layout.activity_main);
                                                
                                                QuestionsBDD questionsBdd = new QuestionsBDD(this);
                                                questionsBdd.open();
                                                Questions questionFromBdd = questionsBdd.getQuestionWithID(1);
                                                String test = questionFromBdd.getQuestion().toString();
                                                questionsBdd.close();
                                                Toast.makeText(this, test, Toast.LENGTH_LONG).show();
                                            }
                                        	
                                            @Override
                                            public boolean onCreateOptionsMenu(Menu menu) {
                                                getMenuInflater().inflate(R.menu.activity_main, menu);
                                                return true;
                                            }  
                                        }
                                        


                                        Ensuite, voici la classe MaBaseSQLite qui extends de SQLiteOpenHelper et qui est appelée lors de la création/modification de ma BDD :

                                        package com.android.tutoquestionreponse;
                                        
                                        import android.content.Context;
                                        import android.database.sqlite.SQLiteDatabase;
                                        import android.database.sqlite.SQLiteOpenHelper;
                                        import android.database.sqlite.SQLiteDatabase.CursorFactory;
                                        
                                        public class MaBaseSQLite extends SQLiteOpenHelper{
                                        	
                                        	private ImportCSVToBDD mActivityDemarage;
                                        	
                                        	private static final String TABLE_QUESTIONS = "table_questions";
                                        	private static final String COL_ID = "ID";
                                        	private static final String COL_QUESTION = "QUESTION";
                                        	private static final String COL_REP1 = "Rep1";
                                        	private static final String COL_REP2 = "Rep2";
                                        	private static final String COL_REP3 = "Rep3";
                                        	private static final String COL_REP4 = "Rep4";
                                        	private static final String COL_BONNEREP = "Bonnerep";
                                        	private static final String CREATE_BDD = "CREATE TABLE " + TABLE_QUESTIONS + " ("
                                        	+ COL_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " 
                                        	+ COL_QUESTION + " TEXT NOT NULL, "
                                        	+ COL_REP1 + " TEXT NOT NULL, " 
                                        	+ COL_REP2 + " TEXT NOT NULL, " 
                                        	+ COL_REP3 + " TEXT NOT NULL, "
                                        	+ COL_REP4 + " TEXT NOT NULL, "
                                        	+ COL_BONNEREP + " TEXT NOT NULL);";
                                         
                                        	public MaBaseSQLite(Context context, String name, CursorFactory factory, int version) {
                                        		super(context, name, factory, version);
                                        		mActivityDemarage = new ImportCSVToBDD();
                                        	}
                                         
                                        	@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);
                                        		mActivityDemarage.insertQandR();
                                        	}
                                         
                                        	@Override
                                        	public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
                                        		//On peut faire ce que l'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_QUESTIONS + ";");
                                        		onCreate(db);
                                        		mActivityDemarage.insertQandR();
                                        	}
                                        }
                                        


                                        Puis ma classe Questions qui contient tous les Get/Set :

                                        package com.android.tutoquestionreponse;
                                        
                                        public class Questions {
                                        	
                                        	private int id;
                                        	private String question;
                                        	private String rep1;
                                        	private String rep2;
                                        	private String rep3;
                                        	private String rep4;
                                        	private String bonnerep;
                                         
                                        	public Questions(){}
                                         
                                        	public Questions(String question, String rep1, String rep2, String rep3, String rep4, String bonnerep){
                                        		this.question = question;
                                        		this.rep1 = rep1;
                                        		this.rep2 = rep2;
                                        		this.rep3 = rep3;
                                        		this.rep4 = rep4;
                                        		this.bonnerep = bonnerep;
                                        	}
                                         
                                        	public int getId() {
                                        		return id;
                                        	}
                                         
                                        	public void setId(int id) {
                                        		this.id = id;
                                        	}
                                         
                                        	public String getQuestion() {
                                        		return question;
                                        	}
                                         
                                        	public void setQuestion(String question) {
                                        		this.question = question;
                                        	}
                                         
                                        	public String getRep1() {
                                        		return rep1;
                                        	}
                                         
                                        	public void setRep1(String rep1) {
                                        		this.rep1 = rep1;
                                        	}
                                         
                                        	public String getRep2() {
                                        		return rep2;
                                        	}
                                         
                                        	public void setRep2(String rep2) {
                                        		this.rep2 = rep2;
                                        	}
                                        	
                                        	public String getRep3() {
                                        		return rep3;
                                        	}
                                         
                                        	public void setRep3(String rep3) {
                                        		this.rep3 = rep3;
                                        	}
                                        	
                                        	public String getRep4() {
                                        		return rep4;
                                        	}
                                         
                                        	public void setRep4(String rep4) {
                                        		this.rep4 = rep4;
                                        	}
                                        	
                                        	public String getBonneRep() {
                                        		return bonnerep;
                                        	}
                                         
                                        	public void setBonneRep(String bonnerep) {
                                        		this.bonnerep = bonnerep;
                                        	}
                                        }
                                        


                                        Et enfin, ma classe QuestionsBDD qui me permets de gérer l'insertion, la modification et la suppression de questions dans ma BDD :

                                        package com.android.tutoquestionreponse;
                                        
                                        import android.content.ContentValues;
                                        import android.content.Context;
                                        import android.database.Cursor;
                                        import android.database.sqlite.SQLiteDatabase;
                                        
                                        public class QuestionsBDD {
                                        	
                                        	private static final int VERSION_BDD = 1;
                                        	private static final String NOM_BDD = "questions.db";
                                         
                                        	private static final String TABLE_QUESTIONS = "table_questions";
                                        	private static final String COL_ID = "ID";
                                        	private static final int NUM_COL_ID = 0;
                                        	private static final String COL_QUESTION = "QUESTION";
                                        	private static final int NUM_COL_QUESTION = 1;
                                        	private static final String COL_REP1 = "Rep1";
                                        	private static final int NUM_COL_REP1 = 2;
                                        	private static final String COL_REP2 = "Rep2";
                                        	private static final int NUM_COL_REP2 = 3;
                                        	private static final String COL_REP3 = "Rep3";
                                        	private static final int NUM_COL_REP3 = 4;
                                        	private static final String COL_REP4 = "Rep4";
                                        	private static final int NUM_COL_REP4 = 5;
                                        	private static final String COL_BONNEREP = "Bonnerep";
                                        	private static final int NUM_COL_BONNEREP = 6;
                                         
                                        	private SQLiteDatabase bdd;
                                         
                                        	private MaBaseSQLite maBaseSQLite;
                                         
                                        	public QuestionsBDD(Context context){
                                        		//On créer la BDD et sa table
                                        		maBaseSQLite = new MaBaseSQLite(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 insertQuestion(Questions question){
                                        		//Création d'un ContentValues (fonctionne comme une HashMap)
                                        		ContentValues values = new ContentValues();
                                        		//on lui ajoute une valeur associé à une clé (qui est le nom de la colonne dans laquelle on veut mettre la valeur)
                                        		values.put(COL_QUESTION, question.getQuestion());
                                        		values.put(COL_REP1, question.getRep1());
                                        		values.put(COL_REP2, question.getRep2());
                                        		values.put(COL_REP3, question.getRep3());
                                        		values.put(COL_REP4, question.getRep4());
                                        		values.put(COL_BONNEREP, question.getBonneRep());
                                        		//on insère l'objet dans la BDD via le ContentValues
                                        		return bdd.insert(TABLE_QUESTIONS, null, values);
                                        	}
                                         
                                        	public int updateQuestion(int id, Questions question){
                                        		//La mise à jour d'un livre dans la BDD fonctionne plus ou moins comme une insertion
                                        		//il faut simple préciser quelle livre on doit mettre à jour grâce à l'ID
                                        		ContentValues values = new ContentValues();
                                        		values.put(COL_QUESTION, question.getQuestion());
                                        		values.put(COL_REP1, question.getRep1());
                                        		values.put(COL_REP2, question.getRep2());
                                        		values.put(COL_REP3, question.getRep3());
                                        		values.put(COL_REP4, question.getRep4());
                                        		values.put(COL_BONNEREP, question.getBonneRep());
                                        		return bdd.update(TABLE_QUESTIONS, values, COL_ID + " = " +id, null);
                                        	}
                                         
                                        	public int removeQuestionWithID(int id){
                                        		//Suppression d'un livre de la BDD grâce à l'ID
                                        		return bdd.delete(TABLE_QUESTIONS, COL_ID + " = " +id, null);
                                        	}
                                         
                                        	public Questions getQuestionWithID(int ID){
                                        		//Récupère dans un Cursor les valeur correspondant à un livre contenu dans la BDD (ici on sélectionne le livre grâce à son titre)
                                        		Cursor c = bdd.query(TABLE_QUESTIONS, new String[] {
                                        				COL_ID, 
                                        				COL_QUESTION, 
                                        				COL_REP1,
                                        				COL_REP2,
                                        				COL_REP3,
                                        				COL_REP4,
                                        				COL_BONNEREP,
                                        		}, COL_ID + " LIKE \"" + ID +"\"", null, null, null, null);
                                        		return cursorToQuestions(c);
                                        	}
                                         
                                        	public Questions getQuestionWithQuestion(String question){
                                        		//Récupère dans un Cursor les valeur correspondant à un livre contenu dans la BDD (ici on sélectionne le livre grâce à son titre)
                                        		Cursor c = bdd.query(TABLE_QUESTIONS, new String[] {
                                        				COL_ID, 
                                        				COL_QUESTION, 
                                        				COL_REP1,
                                        				COL_REP2,
                                        				COL_REP3,
                                        				COL_REP4,
                                        				COL_BONNEREP,
                                        		}, COL_QUESTION + " LIKE \"" + question +"\"", null, null, null, null);
                                        		return cursorToQuestions(c);
                                        	}
                                        	
                                        	
                                        	//Cette méthode permet de convertir un cursor en un livre
                                        	private Questions cursorToQuestions(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 livre
                                        		Questions question = new Questions();
                                        		//on lui affecte toutes les infos grâce aux infos contenues dans le Cursor
                                        		
                                        		question.setId(c.getInt(NUM_COL_ID));
                                        		question.setQuestion(c.getString(NUM_COL_QUESTION));
                                        		question.setRep1(c.getString(NUM_COL_REP1));
                                        		question.setRep2(c.getString(NUM_COL_REP2));
                                        		question.setRep3(c.getString(NUM_COL_REP3));
                                        		question.setRep4(c.getString(NUM_COL_REP4));
                                        		question.setBonneRep(c.getString(NUM_COL_BONNEREP));
                                        		
                                        		//On ferme le cursor
                                        		c.close();
                                         
                                        		//On retourne le livre
                                        		return question;
                                        	}
                                        
                                        }
                                        



                                        J'espère que cela va vous paraître clair et concis, et désolé si je vous fais perdre pas mal de temps avec ce problème ^^

                                        Cordialement, Gnaag.
                                        • Partager sur Facebook
                                        • Partager sur Twitter
                                          2 août 2012 à 13:52:46

                                          C'est bien normal, tu n'as pas créer la méthode toString!
                                          Je te conseille de rajouter e code à la fin de la classe Question
                                          public String toString(){
                                          return "Question : "+question +"\nRep1 : " +rep1 +"\nRep2 : "+ rep2 +"\nRep3 : "+ rep3 +"\nRep4 : "+ rep4 +"\nBonne Rep : " +bonnerep
                                          
                                          }
                                          
                                          la méthode toString() ici ne converti pas une donnée en string comme d'habitude! On pourrait dire qu'elle sert à "résumer" la classe java. Tu dois donc définir la méthode toString() sinon elle affiche un message par défaut!
                                          
                                          • Partager sur Facebook
                                          • Partager sur Twitter
                                            2 août 2012 à 19:00:36

                                            Très bien merci, je testerais ça quand je pourrais. Et par rapport au fait que mon appli plante a cause d'un NullPointerException jusqu’à ce que je mette en commentaire l'appelle de la méthode insertQandR() (autrement dis jusqu’à ce que la BDD soit créée?), tu as une idée?
                                            • Partager sur Facebook
                                            • Partager sur Twitter
                                              2 août 2012 à 19:32:00

                                              Non, je vois pas trop pourquoi... sinon tu suprime est re-créer la bdd a chaque lancage...
                                              • Partager sur Facebook
                                              • Partager sur Twitter
                                                2 août 2012 à 21:18:50

                                                Bon, j'ai apporté quelques modifications : Concrètement, j'ai mis le contenu de ma méthode insertQandR() dans le onCreate de ma classe ImportCSVToBDD, puis j'ai donc supprimé ma méthode insertQandR() et donc aussi retiré l'appel de cette même méthode dans le onCreate() ainsi que dans le onUpgrade() de ma classe MaBaseSQLite. Résultat, ça à l'air de fonctionné, j'arrive a afficher le contenu de mes questions.

                                                Voici les modifications apportées :

                                                Pour ma classe ImportCSVToBDD :
                                                package com.android.tutoquestionreponse;
                                                
                                                import java.io.BufferedReader;
                                                import java.io.IOException;
                                                import java.io.InputStream;
                                                import java.io.InputStreamReader;
                                                import java.util.ArrayList;
                                                import java.util.StringTokenizer;
                                                import android.app.Activity;
                                                import android.content.ContentValues;
                                                import android.content.Context;
                                                import android.content.Intent;
                                                import android.os.Bundle;
                                                
                                                public class ImportCSVToBDD extends Activity {
                                                	
                                                	private QuestionsBDD questionsBdd;
                                                	private Context ctx;
                                                	
                                                	
                                                	@Override
                                                    public void onCreate(Bundle savedInstanceState) {
                                                        super.onCreate(savedInstanceState);
                                                        setContentView(R.layout.activity_main);
                                                
                                                        //Création d'une instance de ma classe QuestionsBDD
                                                        questionsBdd = new QuestionsBDD(this);
                                                        ctx = this;
                                                        questionsBdd.open();
                                                        ContentValues values;
                                                        try {
                                                			InputStream file= ctx.getAssets().open("QandR.csv");
                                                			InputStreamReader FileReader= new InputStreamReader(file);
                                                			BufferedReader r = new BufferedReader(FileReader);
                                                			String line = null;
                                                			String value = null;
                                                			ArrayList<String> dataRow;
                                                			StringTokenizer token;
                                                			while((line=r.readLine())!=null) {
                                                				values= new ContentValues();
                                                				dataRow = new ArrayList<String>();
                                                				token = new StringTokenizer(line, ";");
                                                				while(token.hasMoreElements()) {
                                                					value = (String) token.nextElement();
                                                					dataRow.add(value);
                                                				}
                                                		//cette partie de code est à repeter pour chaque colonne
                                                		values.put("QUESTION", dataRow.get(0));
                                                		values.put("Rep1", dataRow.get(1));
                                                		values.put("Rep2", dataRow.get(2));
                                                		values.put("Rep3", dataRow.get(3));
                                                		values.put("Rep4", dataRow.get(4));
                                                		values.put("Bonnerep", dataRow.get(5));				
                                                		questionsBdd.getBDD().insert("table_questions", null, values);
                                                			}				 
                                                		}
                                                	catch (IOException e) {
                                                	e.printStackTrace();
                                                		}
                                                        questionsBdd.close();
                                                        Intent i = new Intent(this, MainActivity.class);
                                                		startActivity(i);		
                                                	}
                                                }
                                                


                                                Et ma classe MaBaseSQLite :

                                                package com.android.tutoquestionreponse;
                                                
                                                import android.content.Context;
                                                import android.database.sqlite.SQLiteDatabase;
                                                import android.database.sqlite.SQLiteOpenHelper;
                                                import android.database.sqlite.SQLiteDatabase.CursorFactory;
                                                
                                                public class MaBaseSQLite extends SQLiteOpenHelper{
                                                	
                                                	private ImportCSVToBDD mActivityDemarage;
                                                	
                                                	private static final String TABLE_QUESTIONS = "table_questions";
                                                	private static final String COL_ID = "ID";
                                                	private static final String COL_QUESTION = "QUESTION";
                                                	private static final String COL_REP1 = "Rep1";
                                                	private static final String COL_REP2 = "Rep2";
                                                	private static final String COL_REP3 = "Rep3";
                                                	private static final String COL_REP4 = "Rep4";
                                                	private static final String COL_BONNEREP = "Bonnerep";
                                                	private static final String CREATE_BDD = "CREATE TABLE " + TABLE_QUESTIONS + " ("
                                                	+ COL_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " 
                                                	+ COL_QUESTION + " TEXT NOT NULL, "
                                                	+ COL_REP1 + " TEXT NOT NULL, " 
                                                	+ COL_REP2 + " TEXT NOT NULL, " 
                                                	+ COL_REP3 + " TEXT NOT NULL, "
                                                	+ COL_REP4 + " TEXT NOT NULL, "
                                                	+ COL_BONNEREP + " TEXT NOT NULL);";
                                                 
                                                	public MaBaseSQLite(Context context, String name, CursorFactory factory, int version) {
                                                		super(context, name, factory, version);
                                                		mActivityDemarage = new ImportCSVToBDD();
                                                	}
                                                 
                                                	@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 faire ce que l'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_QUESTIONS + ";");
                                                		onCreate(db);
                                                	}
                                                }
                                                


                                                As tu une idée de pourquoi ça marche comme ça? Penses tu que je devrais ça comme ça?
                                                • Partager sur Facebook
                                                • Partager sur Twitter
                                                  3 août 2012 à 12:16:29

                                                  Comme tu l'as fait tu va inseres tes q à chaques lancement :/
                                                  Sinon, tu créer une autre classe (encore :/) que tu lance au lancement. Tu ouvres la bdd et tu la ferme puis tu lance cette classe en entier à l'ouverture de la bdd
                                                  • Partager sur Facebook
                                                  • Partager sur Twitter
                                                    3 août 2012 à 12:54:18

                                                    Merci de ta réponse, j'avais complétement oublié ce problème... Et ce problème commence à me faire perdre patience ^^
                                                    Sinon je pourrais supprimer et recréer ma table à chaque lancement, mais il n'y aurait plus d’intérêt d'utiliser la base de données...
                                                    Ça me semble curieux que ça marche en mettant tout dans le onCreate de ma classe ImportCSVToBDD alors que ça ne fonctionne pas en passant par ma méthode insertQandR().
                                                    • Partager sur Facebook
                                                    • Partager sur Twitter
                                                      3 août 2012 à 14:28:54

                                                      oui :/ Sinon, tu peux jouer sur des versions grâce aux shared preference....
                                                      • Partager sur Facebook
                                                      • Partager sur Twitter
                                                        3 août 2012 à 15:20:00

                                                        Et si je mettais le contenu de ma méthode insertQ&R() directement dans le onCreate() et le onUpgrade() de ma classe MaBaseSQLite qui extends de SQLiteOpenHelper, tu penses que ça pourrais fonctionner? Si oui, dans ce cas la, ca n'ajouteras pas mes questions a chaque démarrage de l'application?
                                                        • Partager sur Facebook
                                                        • Partager sur Twitter
                                                          3 août 2012 à 17:03:49

                                                          Ca ne marcherai pas car la méthode getAsset() ne fonctionne que dans les classes de type Activity :/
                                                          • Partager sur Facebook
                                                          • Partager sur Twitter
                                                            3 août 2012 à 18:26:22

                                                            hum oui c'est vrai, c'est pas évident tout ça... Mais je ne comprends pas pourquoi j'ai une erreur pour chaque open() dans ma classe ImportCSVToBDD, une autre lors de l'appel de ma méthode insertQandR() dans le onCreate de ma classe MaBaseSQLite, et une autre lors du getWritableDatabase() dans le open() de ma classe QuestionsBDD.

                                                            Le fait de faire plusieurs open()/close() dans une application ne provoque pas d'erreur par hasard?
                                                            • Partager sur Facebook
                                                            • Partager sur Twitter
                                                              3 août 2012 à 18:40:04

                                                              Non, je ne pense pas ....
                                                              • Partager sur Facebook
                                                              • Partager sur Twitter

                                                              [Android] Jeu question/réponse - Comment m'y prendre?

                                                              × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                                              × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                                                              • Editeur
                                                              • Markdown