re-open an already-closed object : SQLiteDatabase
Bonjour,
Je vais essayer d'exprimer mon besoin dans des termes claire... (C'est pas gagné :aie:)
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:
Code:
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 code de mon Activity:
Code:
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 !
}
}); |
Le LogCat:
Code:
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