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 :

[SQLite] le onUpgrade ne s’exécute plus


Sujet :

Android

  1. #1
    Membre du Club
    Homme Profil pro
    -
    Inscrit en
    Novembre 2007
    Messages
    64
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : -

    Informations forums :
    Inscription : Novembre 2007
    Messages : 64
    Points : 45
    Points
    45
    Par défaut [SQLite] le onUpgrade ne s’exécute plus
    Bonjour,

    J'ai un souci avec la base de données interne SQLite, jusque là, mon application exécutait bien la mise à jour de la base (onUpgrade) quand j'ajoutai 1 à la version de la base. Mais après avoir modifié le programme, plus rien ne s'exécute à ce niveau.

    Voici un extrait 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
     
     
        private DataBaseRequest db;
        ProgressBar bar;
        TextView txtLoading;
        Data d = new Data();
     
        public void onCreate(Bundle savedInstanceState) {
     
        	super.onCreate(savedInstanceState);
        	requestWindowFeature(Window.FEATURE_NO_TITLE);
            setContentView(R.layout.page_loading);
            bar = (ProgressBar) findViewById(R.id.ProgressBarLoad);
            txtLoading = (TextView) findViewById(R.id.txtLoading);
            new Thread(myThread).start();
            bar.setProgress(0);
     
            //Initialisation de la Base
            db = new DataBaseRequest(this);
     
    [...]
    le DataBaseRequest :

    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
    private SQLiteDatabase bdd;
    	private DataBaseHelper baseIrdes;
    	private Data d = new Data();
     
    	public DataBaseRequest(Context context) {
    		super();
    		System.out.println("Initialisation");
    		baseIrdes = new DataBaseHelper(context, d.dbName, null, d.dbVersion);
    	}
     
    	private void open(){
    		//on ouvre la BDD en écriture
    		bdd = baseIrdes.getWritableDatabase();
    	}
     
    	private void close(){
    		//on ferme l'accès à la BDD
    		bdd.close();
    	}
    [...]
    Data regroupe des données statiques, comme le nom des tables colonnes et version par exemple. En testant avec des out.print, je remarque que le message "initialisation" s'affiche dans logCat, mais rien d'autre après.

    Voici mon DataBaseHelper :

    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
     
     
    public class DataBaseHelper extends SQLiteOpenHelper {
     
    	private Data d = new Data();
     
    	public DataBaseHelper(Context context, String name, CursorFactory factory, int version) {
    		super(context, name, factory, version);
    		System.out.println("Test");
    		// TODO Auto-generated constructor stub
    	}
     
    	@Override
    	public void onCreate(SQLiteDatabase db) {
     
    		d.updateDataBase = true;
    		//Activation prise en charge Foreign Keys
    		db.execSQL("PRAGMA foreign_keys = ON;");
     
    		[...]
    		db.execSQL("CREATE TABLE "+d.actualiteTable+" ("+d.colActualiteNum+ " INTEGER PRIMARY KEY , "+
    			    d.colActualiteTitre+ " TEXT, "+d.colActualiteDate+" TEXT, "+d.colActualiteLien+" TEXT, "+d.colActualiteTypeActu+" INTEGER, " +
    			    		"FOREIGN KEY ("+d.colActualiteTypeActu+") REFERENCES "+d.typeActuTable+" ("+d.colTypeActuNum+"))");
    		[...]
    		  System.out.println("Create table Complete");
    		  InsertRows(db);
    	}
     
     
     
    	@Override
    	public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    		[...]
    		db.execSQL("DROP TABLE IF EXISTS "+d.actualiteTable);
    		[...]
     
    		onCreate(db);
     
    	}
     
    	public void InsertRows (SQLiteDatabase bdd){
     
    		System.out.println("Chargement des données");
     
    		bdd = this.getWritableDatabase();
    		ContentValues cv=new ContentValues();
     
    		// --------- TypeActu -------- //
     
    		cv.put(d.colTypeActuNum, 1);
    		cv.put(d.coltypeActuLibelle, "Gen");
    		bdd.insert(d.typeActuTable, d.colTypeActuNum, cv);
    		[...]
    		bdd.close();
    		System.out.println("Données inserées");
    }
    Les autres messages n'apparaissent plus dans logCat, ce qui laisse penser que l'upgrade ne se fait pas du tout... Seul le message "Test" apparaît. D'où pourrait venir le problème ?

  2. #2
    Membre éclairé
    Avatar de ZouBi
    Inscrit en
    Octobre 2007
    Messages
    508
    Détails du profil
    Informations professionnelles :
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Octobre 2007
    Messages : 508
    Points : 812
    Points
    812
    Par défaut
    Mais après avoir modifié le programme, plus rien ne s'exécute à ce niveau.
    Y a une seule question à se poser dans ce cas :
    Qu'as tu modifié pour que tout d'un coup ça engendre ce genre de comportement dans ton programme?

  3. #3
    Membre du Club
    Homme Profil pro
    -
    Inscrit en
    Novembre 2007
    Messages
    64
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : -

    Informations forums :
    Inscription : Novembre 2007
    Messages : 64
    Points : 45
    Points
    45
    Par défaut
    En fait, j'ai modifié la façon dont je récupère les données plus tard dans une autre activity, et c'était une autre méthode appellée InitList qui se chargeait d'appeler DataBaseRequest (là où sont stockés les Select, il y avait aussi les insertions au début), qui lui se charge d'appeler DataBasHelper (onCreate onUpgrade et les insertions).

    Maintenant, c'est directement l'activity principale qui s'en occupe, à la place de InitList, qui n'existe plus. J'ai heureusement gardé l'ancienne version avant d'apporter des modifications, et je ne vois pas le problème dans tout ça.

    Logiquement, quand on appelle DataBaseHelper, le onUpgrade doit se lancer automatiquement si j'ajoute 1 à la version non ?

  4. #4
    Membre éclairé
    Avatar de ZouBi
    Inscrit en
    Octobre 2007
    Messages
    508
    Détails du profil
    Informations professionnelles :
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Octobre 2007
    Messages : 508
    Points : 812
    Points
    812
    Par défaut
    Le onUpgrade ne s'exécutera qu'une seule fois, si lors de l'initialisation; il constate un changement de version de la BDD depuis la dernière exécution (même si tu rétrogrades, c'est à dire -1; ça le fait).

    Au prochain lancement du programme; si la version n'a plus bougée, le onUpgrade ne sera pas appelé.

    Apparemment, si j'ai bien compris; la version de ta BDD; tu la mets dedans :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    private Data d = new Data();
    d.dbVersion;
    C'est quoi ça, ce type Data?

  5. #5
    Membre du Club
    Homme Profil pro
    -
    Inscrit en
    Novembre 2007
    Messages
    64
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : -

    Informations forums :
    Inscription : Novembre 2007
    Messages : 64
    Points : 45
    Points
    45
    Par défaut
    Je stocke tout ce qui concerne le nom des tables, colonnes, version et nom de base. Voici un extrait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    	public static final String dbName="irdesDB";
    	public static final int dbVersion=46;
     
    	public static final String actualiteTable="Actualite";
    	public static final String colActualiteNum="numActu";
    	public static final String colActualiteTitre="titre";
    	public static final String colActualiteDate="date";
    	public static final String colActualiteLien="lien";
    	public static final String colActualiteTypeActu="numTypeActu";
    	[...]
    Cela m'a évité de faire des erreurs quand j'ai écris les Create table, insertions et select

  6. #6
    Membre du Club
    Homme Profil pro
    -
    Inscrit en
    Novembre 2007
    Messages
    64
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : -

    Informations forums :
    Inscription : Novembre 2007
    Messages : 64
    Points : 45
    Points
    45
    Par défaut
    J'ai fait des tests SQL avec cette ligne dans DataBaseRequest:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    baseIrdes = new DataBaseHelper(context, d.dbName, null, d.dbVersion);
    		bdd = baseIrdes.getWritableDatabase();
    		System.out.println(bdd.rawQuery("SELECT * FROM "+d.actualiteTable,new String [] {}).getColumnCount());
    le getColumnCount me renvoie 5, mais le getCount me renvoie 0. La base existe bien, mais pas les données insérées.

    Bizarrement, le onUpgrade s'est executé à un moment dans mes tests, quand j'ai ajouté 1 à version cette fois-ci, et justement, la ligne que j'ai ajouté précédemment provoque une erreur :

    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
    FATAL EXCEPTION: main
    java.lang.RuntimeException: Unable to start activity ComponentInfo{com.irdes.application/com.irdes.application.irdesApplication}: java.lang.IllegalStateException: getWritableDatabase called recursively
         at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1647)
         at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1663)
         at android.app.ActivityThread.access$1500(ActivityThread.java:117)
         at android.app.ActivityThread$H.handleMessage(ActivityThread.java:931)
         at android.os.Handler.dispatchMessage(Handler.java:99)
         at android.os.Looper.loop(Looper.java:123)
         at android.app.ActivityThread.main(ActivityThread.java:3683)
         at java.lang.reflect.Method.invokeNative(Native Method)
         at java.lang.reflect.Method.invoke(Method.java:507)
         at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
         at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
         at dalvik.system.NativeStart.main(Native Method)
     Caused by: java.lang.IllegalStateException: getWritableDatabase called recursively
        at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:101)
        at com.irdes.db.DataBaseHelper.InsertRows(DataBaseHelper.java:146)
         at com.irdes.db.DataBaseHelper.onCreate(DataBaseHelper.java:108)
         at com.irdes.db.DataBaseHelper.onUpgrade(DataBaseHelper.java:135)
         at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:132)
         at com.irdes.db.DataBaseRequest.<init>(DataBaseRequest.java:39)
         at com.irdes.application.irdesApplication.onCreate(irdesApplication.java:42)
         at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
         at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1611)
         ... 11 more
    Bien entendu, c'est parce que j'ai appelé deux fois getWritable dans mon programme, d'où l'erreur, mais ce que je ne comprend pas, c'est que quand je supprime cette ligne, le problème revient !

  7. #7
    Membre du Club
    Homme Profil pro
    -
    Inscrit en
    Novembre 2007
    Messages
    64
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : -

    Informations forums :
    Inscription : Novembre 2007
    Messages : 64
    Points : 45
    Points
    45
    Par défaut
    Quelqu'un aurait une solution ? Car je suis assez bloqué à cause de ça.

    EDIT : J'ai finalement la réponse, il faut impérativement ouvrir la base avec open() pour que cela s'exécute, une erreur bête.

    Réponse trouvée sur : http://stackoverflow.com/questions/6...en-i-called-it

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

Discussions similaires

  1. Version de BDD SQlite, onUpgrade jamais appelée
    Par kegilko dans le forum Android
    Réponses: 11
    Dernier message: 21/01/2013, 00h28
  2. Les PC sont de plus en plus bruyants que faire
    Par plichtal dans le forum Ordinateurs
    Réponses: 260
    Dernier message: 23/12/2011, 12h28
  3. [DOS][Mémoire] Allouer plus de 64 Ko
    Par Pascool dans le forum C
    Réponses: 3
    Dernier message: 11/02/2003, 10h26
  4. Réponses: 3
    Dernier message: 16/12/2002, 16h12
  5. [Datareport] Etat plus large que le papier
    Par SpaceFrog dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 09/09/2002, 11h45

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