2011-04-29 114 views
3

我写了一些代码来确保我的数据库在我将应用程序发布更新时能够正确更新。更新数据库不起作用-Android

问题是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()函数,它的工作原理。

有谁知道有什么问题?

谢谢!

+0

我不明白为什么你想在SharedPreferences手动存储的版本,这是不必要。每当你发布一个新版本的应用程序,将ver_code增加到2(在你的代码中),升级方法将被自动调用。 – dmon 2011-04-29 15:08:22

回答

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) { 
    // ... 
    } 
} 
+0

这正是我所说的,但带有代码。 – 2011-04-29 20:10:02

0

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

另外,你有没有试过在读或写模式下打开数据库?

1

两件事情:

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

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

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