【问题标题】:Sqlite - on downgradeSqlite - 降级
【发布时间】:2013-11-05 10:39:07
【问题描述】:

最近我更新了我的android游戏,编辑sqlite数据库在我的表中添加了新字段,更新后,我收到了4个崩溃报告(其中3个来自同一设备,三星Galaxy S4)

android.database.sqlite.SQLiteException:无法从 版本 2 到 1 在 android.database.sqlite.SQLiteOpenHelper.onDowngrade(SQLiteOpenHelper.java:361) 在 android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:255) 在 android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:164)

我真的不明白可能是什么原因,什么时候甚至可以开始降级数据库,而实际上需要在我的最后一个数据库中升级。

在更新过程中,我明显将 DATABASE_VERSION 值从 1 增加到了 2

我没有重写 onDowngrade 方法,我的 onUpgrade 如下所示:

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)
{
    updateToVersion2(db, oldVersion, newVersion);
}

private void updateToVersion2(SQLiteDatabase db, int oldVersion, int newVersion)
{
    if (oldVersion <= 1)
    {
        ContentValues cv1 = new ContentValues();
        cv1.put(FIELD_WORLD_ID, 6);
        cv1.put(FIELD_MAX_UNLOCKED, 1);
        db.insert(TABLE_LEVELS, null, cv1);
    }
}

谢谢。

【问题讨论】:

标签: java android database sqlite


【解决方案1】:

问题在于您没有覆盖onDowngrade 方法。正如javadoc 中解释的那样,您需要这样做,否则您会遇到异常:

如果没有被覆盖,默认实现将拒绝降级并抛出 SQLiteException

【讨论】:

  • 这很奇怪,所以现在我想知道为什么它很少发生?我的游戏已经被下载了 2.500.000 次,只出现过很少的问题,比你的答案,你能告诉我,我应该在覆盖后将此方法留空吗?
  • 也许这是三星实现中的一个错误,它在不应该调用降级时调用了降级。您可以尝试实现一个空版本,看看它是否能解决您的问题。
  • 是的,您可以将此方法留空。它基于您的要求。只要确保你没有从onDowngrade 调用super 方法。
  • 是的,S4 和 Note3 也有同样的情况……我没有重写降级方法。有趣的是它所抱怨的数据库从未超过版本#1,但我的错误消息是从 11 降级到 1...非常奇怪。
猜你喜欢
  • 2011-05-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-23
  • 1970-01-01
相关资源
最近更新 更多