【问题标题】:onUpgrade() at newly installed apponUpgrade() 在新安装的应用程序上
【发布时间】:2016-09-21 21:44:19
【问题描述】:

我对 onUpgrade 有点困惑。我正在开发我的应用程序,在开发过程中我确实将DATABASE_VERSION 更改了五次,所以现在是 6。

一切都很顺利,直到我从手机中完全卸载应用程序并重新构建它。从那以后,我收到错误消息,我要求的表都不存在...

我认为现在,当我的 DATABASE_VERSIONin 项目设置为 6 并且新安装的应用程序在开始时将其设置为 6 时,onUpgrade() 不会被调用。

问题是如何为新安装提供我在 onUpgrade 方法中设置的所有查询?

我知道onUpgrade() 被称为无论getWritableDatabase() 被称为什么。但是我的应用在这条车道上崩溃了:

Cursor spinner_cursor = db.rawQuery("SELECT value1 AS _id, value2 FROM tab2", null);

前面是车道:

SQLiteDatabase db = new DBHelper(this).getWritableDatabase();

我在 logCat 中收到此错误:

no such table: car (code 1): , while compiling: SELECT value1 AS _id, value2 FROM tab2

我的 DBHelper.class 看起来像

public class DBHelper extends SQLiteOpenHelper {

private static final String DATABASE_NAME = "DataBase1";
private static final int DATABASE_VERSION = 6; 
private static final String CREATE_QUERY =
        "CREATE TABLE tab1 (id, value1, value2, etc)";

private static final String QUERY_2 =
        "CREATE TABLE tab2 (id, value1, value2, etc)";

private static final String QUERY_3 =
        "CREATE TABLE tab3 (id, value1, value2, etc)";

private static final String QUERY_4 =
        "ALTER TABLE tab2 ADD COLUMN value3 VARCHAR(10) NULL";

private static final String QUERY_5 =
        "ALTER TABLE tab2 ADD COLUMN value4 VARCHAR(10) NULL";

private static final String QUERY_6 =
        "ALTER TABLE tab2 ADD COLUMN value5 VARCHAR(10) NULL";

private static final String QUERY_7 =
        "ALTER TABLE tab3 ADD COLUMN value3 VARCHAR(10) NULL"; 

private static final String QUERY_8 =
        "ALTER TABLE tab3 ADD COLUMN value4 VARCHAR(10) NULL";

private static final String QUERY_9 =
        "ALTER TABLE tab3 ADD COLUMN value5 VARCHAR(10) NULL"; 

private static final String QUERY_10 =
        "ALTER TABLE tab3 ADD COLUMN value6 VARCHAR(10) NULL"; 

private static final String QUERY_11 =
        "ALTER TABLE tab3 ADD COLUMN value7 VARCHAR(10) NULL"; 

private static final String QUERY_12 =
        "DROP TABLE tab3";

private static final String QUERY_13 =
        "CREATE TABLE tab3 (id, value1, value2, etc)";


public DBHelper(Context context){

    super(context, DATABASE_NAME, null, DATABASE_VERSION);
    Log.e("DATABASE OPERATIONS", "Database created / opened");
}

@Override
public void onCreate(SQLiteDatabase db) {

    db.execSQL(CREATE_QUERY);
}

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

    if (oldVersion < 3) {
        db.execSQL(QUERY_2);
        db.execSQL(QUERY_3);
        db.execSQL(QUERY_4);
        db.execSQL(QUERY_5);
        db.execSQL(QUERY_6);
    }

    if (oldVersion < 4) {
        db.execSQL(QUERY_7);
        db.execSQL(QUERY_8);
        db.execSQL(QUERY_9);
        db.execSQL(QUERY_10);
    }

    if (oldVersion < 5){
        db.execSQL(QUERY_11);
    }

    if (oldVersion < 6){
        db.execSQL(QUERY_12);
        db.execSQL(QUERY_13);
    }

提前致谢!

【问题讨论】:

  • 您的应用已经发布了吗?如果没有,那么整个升级都是不必要的。
  • onCreate() 你应该创建所有需要的表,即。 tab2, tab3
  • 事情是我确实卸载了应用程序,然后从中生成了 apk 和安装的应用程序。当问题开始时。你说我应该摆脱所有那些改变和重新创建查询并将它们全部放在一个中,然后将它们放入 onCreate?应用发布后如何运作?
  • 需要调用onCreate()方法中的所有查询。
  • 顺便说一句,我认为String[] queriesString Query_X 更受欢迎。然后,您可以遍历一系列字符串。

标签: android android-sqlite onupdate


【解决方案1】:
@Override
public void onCreate(SQLiteDatabase db) {

     db.execSQL(CREATE_QUERY);
     db.execSQL(QUERY_2);
     db.execSQL(QUERY_3);
     db.execSQL(QUERY_4);
     db.execSQL(QUERY_5);
     db.execSQL(QUERY_6);
     db.execSQL(QUERY_7);
     db.execSQL(QUERY_8);
     db.execSQL(QUERY_9);
     db.execSQL(QUERY_10);
     db.execSQL(QUERY_11);
     db.execSQL(QUERY_12);
     db.execSQL(QUERY_13);

}

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

    if (oldVersion < 3) {
        db.execSQL(QUERY_2);
        db.execSQL(QUERY_3);
        db.execSQL(QUERY_4);
        db.execSQL(QUERY_5);
        db.execSQL(QUERY_6);
    }

    if (oldVersion < 4) {
        db.execSQL(QUERY_7);
        db.execSQL(QUERY_8);
        db.execSQL(QUERY_9);
        db.execSQL(QUERY_10);
    }

    if (oldVersion < 5){
        db.execSQL(QUERY_11);
    }

    if (oldVersion < 6){
        db.execSQL(QUERY_12);
        db.execSQL(QUERY_13);
    }

【讨论】:

  • 好的,我明白了为什么要将所有查询放在 onCreate 方法中,但为什么还需要“onUpgrade”?如果我发布我的应用程序并对数据库结构进行任何更改,也会出现同样的问题。如果我错了纠正我。我只是不明白它在发布后是如何工作的。我担心人们会遇到和我现在一样的崩溃。
  • 有两种情况 1. 数据库还没有初始化。在这种情况下,调用 onCreate() 方法 2. 设备上存在版本 x 的数据库,但您安装了新版本的应用程序,其中更新了版本 y 的数据库,其中 y>x。在这种情况下, onUpgrade() 被调用
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多