我有一个使用数据库的应用程序,使用标准的SQLiteOpenHelper创建和打开.

每当我升级数据库版本时,我也升级了应用程序的版本代码,所以没有办法让数据库下载(数据库版本号总是增加,从不减少).

我通过将android:allowBackup属性设置为false,在我的应用程序中禁用数据库备份.

但是当我在Play商店升级应用程序时,我遇到了很多事故

Can’t downgrade database from version n to 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);

}

}

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐