更新数据库不起作用-Android

时间:2011-04-29 14:57:25

标签: android database sqlite

我写了一些代码,以确保在我发布应用程序更新时正确更新我的数据库。

问题是从不调用SQLiteOpenHelper的OnUpdate()函数。 这是我在主要活动中写的代码 -

    SharedPreferences DB_ver = getSharedPreferences(PREFS_NAME, 0);
    myDbHelper = new DataBaseHelper(con, DB_ver.getInt("DB_ver", 1));
    try {
        if(DB_ver.getInt("DB_ver", 1) !=getPackageManager().getPackageInfo(getPackageName(), 0).versionCode )
        {
              SharedPreferences.Editor editor = DB_ver.edit();
              editor.putInt("DB_ver", getPackageManager().getPackageInfo(getPackageName(), 0).versionCode);
        }
    } catch (NameNotFoundException e) {
        e.printStackTrace();
    }

这是SQLiteOpenHelper的构造函数(扩展了SQLiteOpenHelper) -

public DataBaseHelper(Context context,int ver_code) {       
    super(context, DB_NAME, null, ver_code);
    this.myContext = context;
}   

现在我明白超级线应该自动调用onUpgrade()函数,但它没有。

我已经单独测试了onUpgrade()函数,它可以工作。

有谁知道这是什么问题?

谢谢!

4 个答案:

答案 0 :(得分:1)

两件事:

  1. 您没有致电editor.commit()
  2. 您正在该代码中创建初始版本值为1的数据库。除非您在AndroidManifest.xml中更改版本号,否则它将永远不会是1.除非该版本更改onUpgrade(),否则不需要调用。首次创建数据库时将调用onCreate(),但只有在报告的版本不同时才会调用onUpgrade()

答案 1 :(得分:1)

您应该更改整数“VERSION”以使您的onUpgrade被调用。

此外,onUpgrade接收两个整数,第一个是数据库的当前版本(从中升级),第二个是要升级到的版本。

答案 2 :(得分:1)

你做的事情真的不是必要的。 SQLiteOpenHelper可以满足您的所有需求。这是一个可能的场景。 SQLiteOpenHelper有一个getVersion()方法,以防你需要在某一点查询它(我从未这样做过):

public class MySQLiteOpenHelper extends SQLiteOpenHelper {

  private static final String dbname = "whatever";
  private static final int    dbversion = 1;  // your first version
//private static final int    dbversion = 2;  // your second version
//private static final int    dbversion = 3;  // your third version

  public MySQLiteOpenHelper(Context context) {
    super(context, dbname, null, dbversion);
    this.context = context;
  }

  @Override
  public void onCreate(SQLiteDatabase sqliteDatabase) {
    // ... Create first database content
  }

  @Override
  public void onUpgrade(SQLiteDatabase sqliteDatabase, int oldVersion, int newVersion) {
    switch (newVersion) {
      case dbversion:  // suppose your on third version
        if (oldVersion == 1) {
          upgradeFrom1To2(sqliteDatabase);
          upgradeFrom2To3(sqliteDatabase);
        }

        if (oldVersion == 2) {
          upgradeFrom2To3(sqliteDatabase);
        }

        break;
      default:
        break;
    }
  }

  public void upgradeFrom1To2(SQLiteDatabase sqliteDatabase) {
    // ...
  }

  public void upgradeFrom2To3(SQLiteDatabase sqliteDatabase) {
    // ...
  }
}

答案 3 :(得分:0)

我看到的一件事是您没有将更改提交给您正在打开的SharedPreferences。你需要调用editor.commit();保存对SharedPreferences的更改。

另外,您是否尝试以读取或写入模式实际打开数据库?