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 :

Erreur base de donnée "SQLiteDatabase created and never closed"


Sujet :

Android

  1. #1
    Membre à l'essai
    Homme Profil pro
    Webmarketer
    Inscrit en
    Novembre 2012
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Webmarketer
    Secteur : Service public

    Informations forums :
    Inscription : Novembre 2012
    Messages : 22
    Points : 12
    Points
    12
    Par défaut Erreur base de donnée "SQLiteDatabase created and never closed"
    Bonjour,

    Mon application lance une base de donnée qui a pour fonctionnement un qcm.

    J'ai récupérer le fonctionnement sur un tuto et il fonctionnait bien, mais depuis quelques jours, j'ai ces erreurs dans les logs et je comprends pas la raison. Pouvez-vous m'aider ?

    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
    01-13 22:10:16.686: E/Database(11807): Leak found
    01-13 22:10:16.686: E/Database(11807): java.lang.IllegalStateException: mPrograms size 1
    01-13 22:10:16.686: E/Database(11807): 	at android.database.sqlite.SQLiteDatabase.finalize(SQLiteDatabase.java:1695)
    01-13 22:10:16.686: E/Database(11807): 	at dalvik.system.NativeStart.run(Native Method)
    01-13 22:10:16.686: E/Database(11807): Caused by: java.lang.IllegalStateException: /data/data/com.tmm.android.nomdemonapplication/databases/questionsDb SQLiteDatabase created and never closed
    01-13 22:10:16.686: E/Database(11807): 	at android.database.sqlite.SQLiteDatabase.<init>(SQLiteDatabase.java:1721)
    01-13 22:10:16.686: E/Database(11807): 	at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:763)
    01-13 22:10:16.686: E/Database(11807): 	at com.tmm.android.candide.db.DBHelper.openDataBase(DBHelper.java:114)
    01-13 22:10:16.686: E/Database(11807): 	at com.tmm.android.candide.SplashActivity.getQuestionSetFromDb(SplashActivity.java:119)
    01-13 22:10:16.686: E/Database(11807): 	at com.tmm.android.candide.SplashActivity.onClick(SplashActivity.java:70)
    01-13 22:10:16.686: E/Database(11807): 	at android.view.View.performClick(View.java:2405)
    01-13 22:10:16.686: E/Database(11807): 	at android.view.View.onTouchEvent(View.java:4270)
    01-13 22:10:16.686: E/Database(11807): 	at android.widget.TextView.onTouchEvent(TextView.java:6784)
    01-13 22:10:16.686: E/Database(11807): 	at android.view.View.dispatchTouchEvent(View.java:3796)
    01-13 22:10:16.686: E/Database(11807): 	at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:888)
    01-13 22:10:16.686: E/Database(11807): 	at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:888)
    01-13 22:10:16.686: E/Database(11807): 	at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:888)
    01-13 22:10:16.686: E/Database(11807): 	at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:888)
    01-13 22:10:16.686: E/Database(11807): 	at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:888)
    01-13 22:10:16.686: E/Database(11807): 	at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:1673)
    01-13 22:10:16.686: E/Database(11807): 	at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1114)
    01-13 22:10:16.686: E/Database(11807): 	at android.app.Activity.dispatchTouchEvent(Activity.java:2061)
    01-13 22:10:16.686: E/Database(11807): 	at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:1657)
    01-13 22:10:16.686: E/Database(11807): 	at android.view.ViewRoot.handleMessage(ViewRoot.java:1758)
    01-13 22:10:16.686: E/Database(11807): 	at android.os.Handler.dispatchMessage(Handler.java:99)
    01-13 22:10:16.686: E/Database(11807): 	at android.os.Looper.loop(Looper.java:136)
    01-13 22:10:16.686: E/Database(11807): 	at android.app.ActivityThread.main(ActivityThread.java:4425)
    01-13 22:10:16.686: E/Database(11807): 	at java.lang.reflect.Method.invokeNative(Native Method)
    01-13 22:10:16.686: E/Database(11807): 	at java.lang.reflect.Method.invoke(Method.java:521)
    01-13 22:10:16.686: E/Database(11807): 	at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:850)
    01-13 22:10:16.686: E/Database(11807): 	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:608)
    01-13 22:10:16.686: E/Database(11807): 	at dalvik.system.NativeStart.main(Native Method)
    Et le java de ma base de donnée :

    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
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    public class DBHelper extends SQLiteOpenHelper{
     
    	private static String DB_PATH = "/data/data/com.tmm.android.(nomdemonapplication)/databases/";
    	private static String DB_NAME = "questionsDb";
    	private SQLiteDatabase myDataBase; 
    	private final Context myContext;
     
     
    	public DBHelper(Context context) {
    		super(context, DB_NAME, null, 1);
    		this.myContext = context;
    	}	
     
    	public void createDataBase() throws IOException{
     
    		boolean dbExist = checkDataBase();
    		if(!dbExist)
    		{
    			this.getReadableDatabase();
     
    			try {
    				copyDataBase(); 
    			} catch (IOException e) {
    				throw new Error("Error copying database");
    			}
    		}
    	}
     
    	private boolean checkDataBase(){
    		SQLiteDatabase checkDB = null;
    		try{
    			String myPath = DB_PATH + DB_NAME;
    			checkDB = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READONLY);
    		}catch(SQLiteException e){
    			//database does't exist yet.
    		}
    		if(checkDB != null){
    			checkDB.close();
    		}
     
    		return checkDB != null ? true : false;
    	}
     
    	private void copyDataBase() throws IOException{
     
    		InputStream myInput = myContext.getAssets().open(DB_NAME);
     
    		String outFileName = DB_PATH + DB_NAME;
     
    		OutputStream myOutput = new FileOutputStream(outFileName);
     
    		//transfer bytes from the inputfile to the outputfile
    		byte[] buffer = new byte[1024];
    		int length;
    		while ((length = myInput.read(buffer))>0){
    			myOutput.write(buffer, 0, length);
    		}
     
    		myOutput.flush();
    		myOutput.close();
    		myInput.close();
     
    	}
     
     
    	public void openDataBase() throws SQLException{
    		//Open the database
    		String myPath = DB_PATH + DB_NAME;
    		myDataBase = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READONLY);
     
    	}
     
    	@Override
    	public synchronized void close() {
    		if(myDataBase != null)
    			myDataBase.close();
    		super.close();
    	}
     
    	@Override
    	public void onCreate(SQLiteDatabase db) {
    	}
     
    	@Override
    	public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    	}
    Merci

  2. #2
    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
    A part que je ne comprends l'interêt dans ce code d'hériter de SQLiteOpenHelper (puisqu'aucune fonction de celui-ci n'est appelé)... c'est plutot le code client de Helper qui doit avoir un probleme....

    Vu le code, à chaque appel à openDataBase() doit correspondre un appel à closeDatabase()
    Comme la fonction stocke l'état, et que SQLiteDatabase n'autorise qu'une instance ouverte, cela veut dire qu'à priori cet objet doit être statique, ou membre de Application
    Dans les deux cela veut dire que le open() doit être fait au démarrage de l'application, et le close() à la fermeture de l'application.
    N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
    Et surtout

  3. #3
    Membre à l'essai
    Homme Profil pro
    Webmarketer
    Inscrit en
    Novembre 2012
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Webmarketer
    Secteur : Service public

    Informations forums :
    Inscription : Novembre 2012
    Messages : 22
    Points : 12
    Points
    12
    Par défaut no such table
    Bonsoir Nicroman

    Merci de ta réponse, tes conseils m'ont permis d'essayer quelques trucs.

    Pour le Helper, le code me paraît bien et je pense pas qu'il influe sur le mauvais fonctionnement de 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
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    public class Helper {
     
    	/**
             * This method selects a end game response based on the players score
             * and current difficulty level
             * 
             * @param numCorrect - num correct answers
             * @param numRounds - number of questions
             * @param diff - the difficulty level
             * @return String comment
             */
    	public static String getResultComment(int numCorrect, int numRounds, int diff)
    	{
    		String comm="";
    		int percentage = calculatePercentage(numCorrect, numRounds);
    		switch (diff)
    		{
    		case Constants.EXTREME :
    			if (percentage > 90){
    				comm = "..................................";
    			}else if (percentage >= 80){
    				comm="................................................";
    			}else if (percentage >= 60){
    				comm=...................................................................";
    			}else if (percentage >= 40){
    				comm="..................................................................";
    			}else{
    				comm=".................................................... ";
    			}
    			break;
     
    		default:
    			if (percentage > 90){
    				comm = ".......................................................";
    			}else if (percentage >= 80){
    				comm=".................................................................";
    			}else if (percentage >= 60){
    				comm="................................................................";
    			}else if (percentage >= 40){
    				comm="...........................................................................";
    			}else{
    				comm=".....................................................................";
    			}
    		}
     
    		return comm;
    	}
     
     
    	/**
    	 * Method to return an image to use for the end of game screen
    	 * 
    	 * @param numCorrect - number of correct answers
    	 * @param numRounds - number of rounds
    	 * @param diff - difficulty level
    	 * @return int Image ID
    	 */
    	public static int getResultImage(int numCorrect, int numRounds, int diff){
    		//calculate percentage
    		int percentage = calculatePercentage(numCorrect, numRounds);
     
    		//work out which image
    		if (percentage > 90){
    			if (diff == Constants.EXTREME){
    				return R.drawable.image1;
    			}else{
    				return R.drawable.image2;
    			}
    		}else if (percentage >= 80){
    			return R.drawable.image3;
    		}else if (percentage >= 60){
    			return R.drawable.image4;
    		}else if (percentage >= 40){
    			return R.drawable.image5;
    		}else{
    			return R.drawable.image6;
    		}
    	}
     
     
    	/**
    	 * Calculate the percentage result based on the number correct and number of questions
    	 * 
    	 * @param numCorrect - number of questions right
    	 * @param numRounds - total number of questions
    	 * @return int percentage correct
    	 */
    	private static int calculatePercentage(int numCorrect, int numRounds) {
    		double frac = (double)numCorrect/(double)numRounds;
    		int percentage = (int) (frac*100);
    		return percentage;
    	}
    }
    Du coup, suite à mes dernières modifications, j'ai une nouvelle erreur lorsque j'appuie sur le bouton qui lance la base de donnée...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    01-15 22:25:48.149: E/AndroidRuntime(15566): Uncaught handler: thread main exiting due to uncaught exception
    01-15 22:25:48.165: E/AndroidRuntime(15566): android.database.sqlite.SQLiteException: no such table: QUESTIONS: , while compiling: SELECT * FROM QUESTIONS WHERE DIFFICULTY=2 ORDER BY RANDOM() LIMIT 250
    01-15 22:25:48.165: E/AndroidRuntime(15566): 	at android.database.sqlite.SQLiteProgram.native_compile(Native Method)
    01-15 22:25:48.165: E/AndroidRuntime(15566): 	at android.database.sqlite.SQLiteProgram.compile(SQLiteProgram.java:132)
    01-15 22:25:48.165: E/AndroidRuntime(15566): 	at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:62)
    01-15 22:25:48.165: E/AndroidRuntime(15566): 	at android.database.sqlite.SQLiteQuery.<init>(SQLiteQuery.java:49)
    01-15 22:25:48.165: E/AndroidRuntime(15566): 	at android.database.sqlite.SQLiteDirectCursorDriver.query(SQLiteDirectCursorDriver.java:49)
    01-15 22:25:48.165: E/AndroidRuntime(15566): 	at android.database.sqlite.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java:1245)
    01-15 22:25:48.165: E/AndroidRuntime(15566): 	at android.database.sqlite.SQLiteDatabase.rawQuery(SQLiteDatabase.java:1218)
    01-15 22:25:48.165: E/AndroidRuntime(15566): 	at com.tmm.android.nomdelapplication.db.DBHelper.getQuestionSet(DBHelper.java:142)
    Il semblerait que le code ne trouve pas la table ...

    La table est sous cette forme, que je paramètre avec SQLite Manager (Sous Firefox):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    DROP TABLE IF EXISTS "android_metadata";
    CREATE TABLE "android_metadata" ("locale" TEXT DEFAULT 'en_US');
    INSERT INTO "android_metadata" VALUES('en_US');
    DROP TABLE IF EXISTS "questions";
    CREATE TABLE questions (_id INTEGER PRIMARY KEY, question TEXT, answer TEXT, incorrect1 TEXT, incorrect2 TEXT, incorrect3 TEXT, difficulty INTEGER);

  4. #4
    Expert éminent

    Avatar de Feanorin
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    4 589
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 4 589
    Points : 9 149
    Points
    9 149
    Par défaut
    Bonjour,

    Pour le Helper, le code me paraît bien et je pense pas qu'il influe sur le mauvais fonctionnement de la bdd :
    Ce que voulais te dire nicroman c'est que le code actuel du helper ne t'es pas nécesaire pour ce que tu as besoin ( les méthodes abstraite ne te sont pas utiles)

    tu as essayé d'ouvrir la table sous FireFox ??

    DROP TABLE IF EXISTS "questions";
    CREATE TABLE questions
    Pour ma part je pense qu'il manque des guillemets ...

    Je ne trouves pas dans ton code la requete sql , pourrais t'on voir ce code ?
    Responsable Android de Developpez.com (Twitter et Facebook)
    Besoin d"un article/tutoriel/cours sur Android, consulter la page cours
    N'hésitez pas à consulter la FAQ Android et à poser vos questions sur les forums d'entraide mobile d'Android.

  5. #5
    Membre à l'essai
    Homme Profil pro
    Webmarketer
    Inscrit en
    Novembre 2012
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Webmarketer
    Secteur : Service public

    Informations forums :
    Inscription : Novembre 2012
    Messages : 22
    Points : 12
    Points
    12
    Par défaut Résolu
    Merci pour vos conseils,

    J'ai compris que persévérer, ça payer ! Il y avait bien un problème d'ouverture de bdd, des scripts en trop et inutile, et aussi quelques réglages dans le manifest... Mais maintenant c'est tout bon !

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

Discussions similaires

  1. [CakePHP] Configuration CakePHP 2.5 chez 1and1 erreur base de données
    Par LostRailler dans le forum Bibliothèques et frameworks
    Réponses: 2
    Dernier message: 22/09/2014, 14h43
  2. erreur base de données
    Par cobra2930 dans le forum Administration
    Réponses: 1
    Dernier message: 22/04/2011, 02h52
  3. erreur base de données Derby
    Par root76 dans le forum Autres SGBD
    Réponses: 1
    Dernier message: 28/04/2008, 17h20
  4. Modifier le nom d'une base de donnée avec erreur sy
    Par mmn dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 25/11/2003, 10h12
  5. Réponses: 2
    Dernier message: 19/06/2003, 21h58

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