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

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

    Informations forums :
    Inscription : Novembre 2008
    Messages : 107
    Points : 56
    Points
    56
    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 969
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

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

    Informations forums :
    Inscription : Mars 2012
    Messages : 1 969
    Points : 3 375
    Points
    3 375
    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.
    Si la réponse vous a aidé, pensez à cliquer sur +1

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

    Informations forums :
    Inscription : Novembre 2008
    Messages : 107
    Points : 56
    Points
    56
    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
    Candidat au 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
    Points : 4
    Points
    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 du Club
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    107
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 107
    Points : 56
    Points
    56
    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 é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
    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.
    N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
    Et surtout

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

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

    Informations forums :
    Inscription : Mars 2012
    Messages : 1 969
    Points : 3 375
    Points
    3 375
    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
    Si la réponse vous a aidé, pensez à cliquer sur +1

  8. #8
    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
    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
    N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
    Et surtout

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

    Informations forums :
    Inscription : Novembre 2008
    Messages : 107
    Points : 56
    Points
    56
    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)

  10. #10
    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
    Raaaa je comprends pas....

    Pourquoi veux tu incrémenter la version de la base de données "à la main" ?

    Y a un truc que je comprends pas dans la logique... pour que le "onUpgrade" soit appelé il faut qu'à la construction du SQLiteOpenHelper on lui passe une version de DB > à la version actuelle.
    Ensuite à l'OUVERTURE (la première ouverture) de la base par l'intermédiaire de SQLiteOpenHelper (donc à l'appel de getReadable/getWritable) les fonctions onCreate/onUpgrade/onDowngrade sont appelées en fonction de ce qui est stocké dans le fichier DB et la valeur passée à la construction.

    Si tu cherches un autre comportement, il va falloir se passer de SQLiteOpenHelper.
    N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
    Et surtout

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

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

    Informations forums :
    Inscription : Mars 2012
    Messages : 1 969
    Points : 3 375
    Points
    3 375
    Par défaut
    Juste pour dire que j'ai tout recommencé mes onUpgrade, onCreate différement et tout marche nickel maintenant

    Attention que peut parfois retourner une version égale à zéro.

    Le onUpgrade est également appelé si on downgrade la version.
    Par exemple on met la version=30 et la db est déjà à 33.

    Ne pas oublier de changer cette version avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    database.setVersion(<version>)
    une fois que tout est terminé.

    Vous retrouverez cette version dans la variable oldVersion lors du prochain appel.
    Si la réponse vous a aidé, pensez à cliquer sur +1

  12. #12
    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
    Ou alors simplement utiliser SQLiteOpenHelper.getWritableDatabase() qui fait tout tout seul (incrément/comparaison/appels de onCreate/onUpdate/onDowngrade)
    N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
    Et surtout

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