android 无法将Samsung上的数据库从版本'n'降级到'n-1'

os8fio9y  于 2022-12-09  发布在  Android
关注(0)|答案(3)|浏览(166)

我有一个带有数据库的应用程序,它是使用标准的SQLiteOpenHelper创建和打开的。
每当我升级数据库版本时,我也会升级应用程序的版本代码,因此数据库不会下降(数据库版本号总是增加,而不是减少)。
我通过将android:allowBackup属性设置为false禁用了应用中的数据库备份。
但是当我在Play商店升级应用程序时,我遇到了很多崩溃
无法将数据库从版本n降级到n-1
96%的崩溃发生在三星设备运行上。有人知道为什么会出现这个问题,更重要的是如何防止这种崩溃吗?
我知道我可以覆盖onDowngrade来防止崩溃,但我实际上不明白为什么调用onDowngrade,因为崩溃是在一个总是使用数据库最新版本的应用程序上调用的。

编辑:添加了代码示例,FWIW

我的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);
    }
}

以及如何初始化它:

public class DatabaseController {

    private MyDBHelper mDBHelper;

    public void initialize(final Context context) {

       mDBHelper = new MyDBHelper(context);

    }
}
zvms9eto

zvms9eto1#

这是SQLiteOpenHelper.onDowngrade(...)的默认实现:

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

如果调用super.onDowngrade(...),就会出现异常,需要自己实现onDowngrade,而不是调用super.onDowngrade,为了完整性,因为无法保证何时调用该应用程序-用户改为使用旧版本的应用程序听起来很奇怪,但可能会出现类似的情况。您是否知道异常来自应用程序的哪个版本?

llew8vvj

llew8vvj2#

您在@etan中的评论回答:
为什么毫无理由地调用onDowngrade?
有绝对的理由,

public static final int DB_V5_USAGE_TABLE = 5;

public static final int DB_VERSION = DB_V5_USAGE_TABLE;

你的DB_VERSION保存了5,在你的构造函数中,你传递了这个值。显然,version的参数应该大于以前的版本,否则你会得到这个消息。
正如@etan所表达的,如果需要降级版本,则需要正确地覆盖onDowngrade方法,而不是再次抛出错误。
您可能知道这一点,因此请尝试记住以前的版本或尝试为数据库版本参数传递6或更高版本。

g52tjvyc

g52tjvyc3#

您可以通过删除“super.onDowngrade(db,oldVersion,newVersion);“行或对其进行注解

@Override
public void onDowngrade(SQLiteDatabase db, int oldVersion, int newVersion) {
  //super.onDowngrade(db, oldVersion, newVersion);
  Log.w(TAG, "Downgrade database from version " + oldVersion + " to " + newVersion);
}

相关问题