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 :

Version de BDD SQlite, onUpgrade jamais appelée


Sujet :

Android

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    107
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 107
    Par défaut Version de BDD SQlite, onUpgrade jamais appelée
    Bonsoir =)

    Si j'ai bien compris, lorsque la classe provider appelle le onCreate de SQLiteOpenHelper si la version de la base installée dans l'Android est supérieur à la version donnée par défaut (private final DATABASE_VERSION = 1; ). Alors la méthode onUpgrade de SQLiteOpenHelper doit être automatiquement appelée.

    Or ce n'est pas le cas.. j'incrémente bien la version de ma base via la méthode getVersion() (ceci fait à l'aide d'un bouton et vérifié avec quelques Toasts/log.i). J'ai également mis un Log.i au début de la méthode onUpgrade de SQLiteOpenHelper. Mais lorsque j'incrémente la version de ma base et que je relance l'application (run depuis Eclipse) :

    - la base de données reste inchangée si j'ai modifié ces données avant de relancer.
    - la version de la base a belle et bien été incrémentée.
    - dans le logCat, je ne vois pas de trace de mon Log.i de onUpgrade..

    J'ai parcouru la doc' et quelques forums...Je ne comprend pas d'où ça peut venir..
    Voici mon constructeur OpenHelper et ma méthode onUpgrade, de la classe qui étend SQLiteOpenHelper :

    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
    private static final String DATABASE_NAME = "db_tpcontentprovider";
    private static final int DATABASE_VERSION = 1;
    ...
    public OpenHelper(Context context) {
                super(context, DATABASE_NAME, null, DATABASE_VERSION);
                this.getWritableDatabase();
                Log.e("OpenHelper.OpenHelper", "debut");
            }
    ...
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
                Log.e("OpenHelper.onUpdate", "debut");
                db.execSQL("DROP TABLE IF EXISTS " + TABLE_PLANETS +";");
                onCreate(db);
                Log.e("OpenHelper.onUpdate", "fin");
            }
    et ma méthode onCreate de la classe qui étend ContentProvider :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    public boolean onCreate() {
            Log.e("Provider.onCreate", "debut");
            mOpenHelper = new OpenHelper(getContext());
            Log.e("Provider.onCreate", "fin");
            return true;
        }
    Comme vous pouvez le voir, mon code est minimaliste et très similaire à celui de l'exemple "LoaderThrottle.java".Du coup, je comprend encore moins pourquoi le onUpgrade de mon "SQLiteOpenHelper" n'est pas appelé.
    Merci d'avance pour votre aide =)

  2. #2
    Membre extrêmement actif
    Profil pro
    Développeur
    Inscrit en
    Mars 2012
    Messages
    1 970
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Mars 2012
    Messages : 1 970
    Par défaut
    J'ai également un problème avec onUpgrade, donc ce sujet m'intéresse mais je vois qu'il te manque les dans le onCreate.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    107
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 107
    Par défaut
    Le onCreate que j'ai mis est celui de la classe qui étend ContentProvider.
    Dans cette méthode, la ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    mOpenHelper = new OpenHelper(getContext());
    Crée un objet qui appelle implicitement le onCreate de la classe qui étend SQLiteOpenHelper. C''est dans ce onCreate que la table est créée ^^ (que je n'ai pas copié collé ici étend donné que ce n'est pas le sujet de ce post).

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2012
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4
    Par défaut
    Salut, moi aussi j'ai un problème avec onUpgrade qui ne se lance pas ! alors que je change la version de la base de donnée , je comprend pas pourquoi

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    107
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 107
    Par défaut
    Estce qu'on pourrait bien me confirmer que le onUpgrade est bien censé être appelé lorsque la version de la base de donnée stockée sur l'appareil est supérieur à celle initialisée par l'application ?

    Ne trouvant toujours pas réponse, j'ai l'impression de faire fausse route la :/

  6. #6
    Expert confirmé

    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
    Billets dans le blog
    3
    Par défaut
    Il suffit de regarder le code de SQLiteOpenHelper:
    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
     
                int version = db.getVersion();
                if (version != mNewVersion) {
                    db.beginTransaction();
                    try {
                        if (version == 0) {
                            onCreate(db);
                        } else {
                            onUpgrade(db, version, mNewVersion);
                        }
                        db.setVersion(mNewVersion);
                        db.setTransactionSuccessful();
                    } finally {
                        db.endTransaction();
                    }
                }
    Donc onUpgrade devrait être appelé dès que le numéro de version est changé dans un sens comme dans l'autre.

  7. #7
    Membre extrêmement actif
    Profil pro
    Développeur
    Inscrit en
    Mars 2012
    Messages
    1 970
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Mars 2012
    Messages : 1 970
    Par défaut
    Oui le onUpgrade est bien appelé mais le code de Nicroman est différent, il y a
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    db.setVersion(mNewVersion);
    que je n'ai jamais vu et mon onUpgrade faisait un drop des tables avant d'appeler onCreate qui les recréait avec le nouveau schéma.

    Merci pour ton code Nicroman, on avance

  8. #8
    Expert confirmé

    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
    Billets dans le blog
    3
    Par défaut
    Non mais ce code, c'est celui du système hein !
    En tout cas, tel qu'il est défini dans les sources de Android 2.1 (android.database.sqlite.SQLiteOpenHelper)
    Je regardes dans les versions plus récentes et il me semble bien que ce soit pareil...

    Ok... sur Android 4.1 c'est:
    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
     
    final int version = db.getVersion();
                if (version != mNewVersion) {
                    if (db.isReadOnly()) {
                        throw new SQLiteException("Can't upgrade read-only database from version " +
                                db.getVersion() + " to " + mNewVersion + ": " + mName);
                    }
     
                    db.beginTransaction();
                    try {
                        if (version == 0) {
                            onCreate(db);
                        } else {
                            if (version > mNewVersion) {
                                onDowngrade(db, version, mNewVersion);
                            } else {
                                onUpgrade(db, version, mNewVersion);
                            }
                        }
                        db.setVersion(mNewVersion);
                        db.setTransactionSuccessful();
                    } finally {
                        db.endTransaction();
                    }
                }
    Une différence donc entre onDowngrade et onUpgrade

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    107
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 107
    Par défaut
    Raaa dans ce cas pourquoi mon onUpgrade n'est pas appelé ? (aucune trace dans le logcat de mes log.i ...).

    Avec le code assez simple montré au premier post..
    Et j'utilise simplement ceci dans un bouton de ma classe Principale :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    ...
    case R.id.incrementerbdd:
            	   Provider.increment();
            	   Toast.makeText(this, String.valueOf(Provider.show_db_version()), Toast.LENGTH_SHORT).show();
    ...
    Donc lorsque je lance mon application, j'incrémente la version de la BDD (elle passe de 1 à 2). Je modifie les données de ma bases via un autre bouton contenant : (et qui fait bien son travail)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    ...
    MainActivity5.getMainContext().getContentResolver().delete(...);
    MainActivity5.getMainContext().getContentResolver().notifyChange(...);
    ...
    Je quitte l'application et je reviens, et les données de ma base qui ont été modifiées restent inchangées. De plus en cliquant sur le bouton de ma classe principale pour incrémenter la version, cette dernière passe bien de la version 2 à 3..donc le changement de version lors du premier lancement a bien été pris en compte à priori et pourtant le onUpgrade n'est pas appelé après !

    no comprende x)

Discussions similaires

  1. Réponses: 1
    Dernier message: 15/02/2014, 16h55
  2. [Outils] Un gestionnaire de versions pour BDD ?
    Par davcha dans le forum Décisions SGBD
    Réponses: 2
    Dernier message: 24/03/2006, 19h32
  3. methode paint jamais appeller.
    Par Blo0d4x3 dans le forum 2D
    Réponses: 9
    Dernier message: 22/01/2006, 22h44
  4. [ Struts ] Erreur : l'action n'est jamais appelé
    Par romain3395 dans le forum Struts 1
    Réponses: 3
    Dernier message: 25/06/2004, 14h59

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