Impossible de basculer la base de données de la version `n` vers` n-1` sur Samsung

J'ai une application avec une base de données, créée et ouverte à l'aide de SQLiteOpenHelper standard.

Chaque fois que je met à jour la version de la base de données, je met également à jour le code de version de l'application, donc il n'y a aucun moyen de basculer (le numéro de version de la base de données est toujours augmenté, ne diminue jamais).

  • Comment modifier la couleur de l'accent sur EditText dans Android
  • Comment passer deux ou plusieurs arguments de sélection dans la méthode "query"
  • Est-il possible de compresser de la vidéo sur Android?
  • Device Owner sur Android 5.0 (et d'autres) sans périphériques enracinés, provisionnement de périphériques par NFC
  • Comment ajouter une transparence d'élément à l'intérieur de RecyclerView quand il est hors de la liste de bordure?
  • Javascript max viewport height after orientation changez Android et iOS
  • J'ai désactivé la sauvegarde de la base de données dans mon application en définissant la propriété android:allowBackup false.

    Mais lorsque je met à jour l'application sur Play Store, j'ai beaucoup de crash

    Impossible de basculer la base de données de la version n vers le n-1

    96% de ces crash apparaissent sur le périphérique Samsung en cours d'exécution. Quelqu'un sait pourquoi ce problème se produit et, plus important encore, comment éviter ce crash?

    Je sais que je peux remplacer l'onDowngrade pour éviter le crash, mais je ne comprends vraiment pas pourquoi onDowngrade est appelé du tout car le crash est appelé sur une application qui utilise toujours la dernière version de la base de données.

    Modifier : Ajout d'un exemple de code, FWIW

    Mon OpenHelper:

     public class MyDBHelper extends SQLiteOpenHelper { private static final String LOG_TAG = MyDBHelper.class.getName(); public static final String DB_NAME = "my_db"; public static final int DB_V1 = 1; public static final int DB_V2_UNIQUE_IDS = 2; public static final int DB_V3_METADATAS = 3; public static final int DB_V4_CORRUPTED_IDS = 4; public static final int DB_V5_USAGE_TABLE = 5; public static final int DB_VERSION = DB_V5_USAGE_TABLE; public MyDBHelper(final Context context, IExceptionLogger logger) { super(context, DB_NAME, null, DB_VERSION); } @Override public void onCreate(final SQLiteDatabase db) { Debug.log_d(DebugConfig.DEFAULT, LOG_TAG, "onCreate()"); db.execSQL(createMyTable()); } @Override public void onUpgrade(final SQLiteDatabase db, final int oldVersion, final int newVersion) { Debug.log_d(DebugConfig.DEFAULT, LOG_TAG, "onUpgrade(): oldVersion = " + oldVersion + " : newVersion = " + newVersion); if (oldVersion < 2) { Debug.log_d(DebugConfig.DEFAULT, LOG_TAG, "onUpgrade(): upgrading version 1 table to version 2"); db.execSQL(upgradeTable_v1_to_v2()); } if (oldVersion < 3) { Debug.log_d(DebugConfig.DEFAULT, LOG_TAG, "onUpgrade(): upgrading version 2 Entry table to version 3"); db.execSQL(upgradeTable_v2_to_v3()); } } @Override @TargetApi(Build.VERSION_CODES.FROYO) public void onDowngrade(final SQLiteDatabase db, final int oldVersion, final int newVersion) { Debug.log_d(DebugConfig.DEFAULT, LOG_TAG, "onDowngrade(): oldVersion = " + oldVersion + " : newVersion = " + newVersion); super.onDowngrade(db, oldVersion, newVersion); } } 

    Et comment je l'initialise:

     public class DatabaseController { private MyDBHelper mDBHelper; public void initialize(final Context context) { mDBHelper = new MyDBHelper(context); } } 

  • Les noms de paquets pour les domaines qui se terminent par .do
  • IabHelper Android bug (NullPointerException) lancePurchaseFlow?
  • Indicateurs de flèche gauche-droite sur un ViewPager
  • Console de développeur Google Play: applications beta testées gratuitement?
  • Comment spécifier des activités qui ne sont que pour les téléphones ou les tablettes sur Android
  • Android Wear WearableListView dans un GridViewPager
  • 2 Solutions collect form web for “Impossible de basculer la base de données de la version `n` vers` n-1` sur Samsung”

    C'est l'implémentation par défaut de SQLiteOpenHelper.onDowngrade(...) :

     public void onDowngrade(SQLiteDatabase db, int oldVersion, int newVersion) { throw new SQLiteException("Can't downgrade database from version " + oldVersion + " to " + newVersion); } 

    Comme vous voyez si vous appelez super.onDowngrade(...) , comme vous le faites, vous obtiendrez cette exception. Vous devez implémenter onDowngrade vous-même, sans appeler super.onDowngrade . Il devrait toujours être mis en œuvre pour des raisons d'exhaustivité, car il n'y a pas de garantie quand il pourrait être appelé – il semble étrange que l'utilisateur ait changé pour utiliser une ancienne version de l'application, mais il pourrait y avoir une situation comme celle-ci. Savez-vous quelle version de l'application proviennent les exceptions?

    Votre commentaire dans la réponse @etan:

    Pourquoi l'onDowngrade n'a-t-il pas été demandé pour aucune raison?

    Il y a une raison absolue,

     public static final int DB_V5_USAGE_TABLE = 5; public static final int DB_VERSION = DB_V5_USAGE_TABLE; 

    Votre DB_VERSION détient 5 et dans votre constructeur, vous passez cette valeur. Évidemment, l'argument pour la version devrait être supérieur à la version précédente sinon vous obtiendrez ce message.

    Comme @etan a exprimé, si vous devez réduire la version, vous devez remplacer correctement la méthode onDowngrade place de lancer l'erreur à nouveau.

    Vous pouvez le savoir, alors essayez de vous souvenir de votre version précédente ou essayez de passer 6 ou plus pour le paramètre de version de la base de données.

    coAndroid est un fan Android de Google, tout sur les téléphones Android, Android Wear, Android Dev et Android Games Apps.