Bonjour,
Je vais essayer d'exprimer mon besoin dans des termes claire... (C'est pas gagné)
Je développe une application Android pour m'entrainer sur les bases de SQLite.
J'ai fait une classe "BDD" de ma classe "metier" (par exemple ma classe métier normal Medicament, je lui est faite une classe MedicamentBDD qui contient les curseurs que j'ai besoin pour manipuler mon objet dans SQL).
Lorsque j'appelle ces classe dans mon Activity, tout ce passe normalement.
C'est alors que le drame arrive:
J'ai besoin d'ajouter un bouton avec une action onclick (jusque là, tout va bien) mais je n'arrive plus à utiliser les classes MedicamentBDD !
Je joint le code pour avoir une idée du souci...
Un élément de ma classe BDD:
Le code de mon Activity:
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 public Medicament getMedicamentWithId(int ID){ //Récupère dans un Cursor les valeur correspondant à un medicament contenu dans la BDD Cursor cursor = bdd.query(GestionnaireBaseSQL.TABLE_NAMEmedicament, new String[] { COL_ID, COL_NAME, COL_MOLECULE}, COL_ID + "=?", new String[] { String.valueOf(ID) }, null, null, null); return cursorToMedicament(cursor); } //Cette méthode permet de convertir un cursor en un medicament private Medicament cursorToMedicament(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 medicament Medicament medicament = convertCursorToObject(c); //On ferme le cursor c.close(); //On retourne le medicament return medicament; }
Le LogCat:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 MedicamentBDD medicamentBDD = new MedicamentBDD(this); medicamentBDD.open(); Medicament medoc = medicamentBDD.getMedicamentWithId(0); //FONCTIONNE CORRECTEMENT Button bt_name = (Button) findViewById(R.id.bt_name); bt_name.setOnClickListener(new View.OnClickListener() { public void onClick(View arg0) { Medicament medoc = medicamentBDD.getMedicamentWithId(0); //NE FONCTIONNE PAS ! } });
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 02-26 09:12:56.374: W/EGL_emulation(11649): eglSurfaceAttrib not implemented 02-26 09:12:56.404: D/OpenGLRenderer(11649): Enabling debug mode 0 02-26 09:13:02.264: W/FileUtils(11649): Failed to chmod(/data/data/com.example.pharmacie/databases/Pharmacie): libcore.io.ErrnoException: chmod failed: EPERM (Operation not permitted) 02-26 09:13:02.284: W/FileUtils(11649): Failed to chmod(/data/data/com.example.pharmacie/databases/Pharmacie): libcore.io.ErrnoException: chmod failed: EPERM (Operation not permitted) 02-26 09:13:02.304: W/FileUtils(11649): Failed to chmod(/data/data/com.example.pharmacie/databases/Pharmacie): libcore.io.ErrnoException: chmod failed: EPERM (Operation not permitted) 02-26 09:13:02.494: W/EGL_emulation(11649): eglSurfaceAttrib not implemented 02-26 09:13:07.174: D/AndroidRuntime(11649): Shutting down VM 02-26 09:13:07.174: W/dalvikvm(11649): threadid=1: thread exiting with uncaught exception (group=0xada54ba8) 02-26 09:13:07.204: E/AndroidRuntime(11649): FATAL EXCEPTION: main 02-26 09:13:07.204: E/AndroidRuntime(11649): Process: com.example.pharmacie, PID: 11649 02-26 09:13:07.204: E/AndroidRuntime(11649): java.lang.IllegalStateException: attempt to re-open an already-closed object: SQLiteDatabase: /data/data/com.example.pharmacie/databases/Pharmacie 02-26 09:13:07.204: E/AndroidRuntime(11649): at android.database.sqlite.SQLiteClosable.acquireReference(SQLiteClosable.java:55) 02-26 09:13:07.204: E/AndroidRuntime(11649): at android.database.sqlite.SQLiteDatabase.queryWithFactory(SQLiteDatabase.java:1156) 02-26 09:13:07.204: E/AndroidRuntime(11649): at android.database.sqlite.SQLiteDatabase.query(SQLiteDatabase.java:1032) 02-26 09:13:07.204: E/AndroidRuntime(11649): at android.database.sqlite.SQLiteDatabase.query(SQLiteDatabase.java:1200) 02-26 09:13:07.204: E/AndroidRuntime(11649): at com.example.pharmacie.dao.MedicamentBDD.getMedicamentWithId(MedicamentBDD.java:117) 02-26 09:13:07.204: E/AndroidRuntime(11649): at com.example.pharmacie.ihm.SupprimerActivity$1.onClick(SupprimerActivity.java:175) 02-26 09:13:07.204: E/AndroidRuntime(11649): at android.view.View.performClick(View.java:4438) 02-26 09:13:07.204: E/AndroidRuntime(11649): at android.view.View$PerformClick.run(View.java:18422) 02-26 09:13:07.204: E/AndroidRuntime(11649): at android.os.Handler.handleCallback(Handler.java:733) 02-26 09:13:07.204: E/AndroidRuntime(11649): at android.os.Handler.dispatchMessage(Handler.java:95) 02-26 09:13:07.204: E/AndroidRuntime(11649): at android.os.Looper.loop(Looper.java:136) 02-26 09:13:07.204: E/AndroidRuntime(11649): at android.app.ActivityThread.main(ActivityThread.java:5017) 02-26 09:13:07.204: E/AndroidRuntime(11649): at java.lang.reflect.Method.invokeNative(Native Method) 02-26 09:13:07.204: E/AndroidRuntime(11649): at java.lang.reflect.Method.invoke(Method.java:515) 02-26 09:13:07.204: E/AndroidRuntime(11649): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779) 02-26 09:13:07.204: E/AndroidRuntime(11649): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595) 02-26 09:13:07.204: E/AndroidRuntime(11649): at dalvik.system.NativeStart.main(Native Method) 02-26 09:13:09.174: I/Process(11649): Sending signal. PID: 11649 SIG: 9
PS: Je développe sous Windows avec Eclipse et j'ai comme AVDM une Nexus 10 4.4.2
Partager