2011-05-27 91 views
1

我想通过向我的android应用程序的Sqlite表中添加一列来升级某个表。我在DBHelper的onUpgrade方法中添加了一个alter table语句。Android onUpgrade每次都会被调用

以下是我看到的问题 我将数据库版本的值从1更改为2,所以最好现在onUpgrade应该被调用。它确实被调用,但每次实例化类时都会调用它。结果我得到一个列已经存在错误。

这里是onUpgrade方法

@Override 
    public void onUpgrade(SQLiteDatabase db, int oldVersion, 
    int newVersion) 
    { 
     Log.d("old Version",oldVersion+""); 
     Log.d("New Version",newVersion+""); 
     db.beginTransaction(); 

     try 
     {   
      String DATABASE_UPGRADE; 
      DATABASE_UPGRADE="alter table "+DATABASE_TABLE_MESSAGES+" ADD COLUMN "+ IS_READ+ " integer DEFAULT 0;"; 
      db.execSQL(DATABASE_UPGRADE); 
      Log.d("upgrade", "Successful"); 
      db.setTransactionSuccessful(); 
     } 


    finally 
    { 
     db.endTransaction(); 
    } 

    } 
}  

我很奇怪,为什么onUpgrade被每次叫!

+0

我不知道,但我愿意打赌,版本没有正确更新数据库(我不明白为什么)。要检查数据库的版本,可以使用'db.getVersion()'。 – dmon 2011-05-27 14:46:53

+0

onUpgrade方法中有2条log.d语句,它们分别显示1和2的值。因此数据库版本为1.我可能需要删除数据库并重试... – Rupin 2011-05-27 14:57:45

回答

1

在数据库帮助器的构造函数中,您是否正确地传递了新的版本号?

编辑:应该是这样的

DatabaseHelper(Context context) 
     { 
      super(context, DATABASE_NAME, null, DATABASE_VERSION); 
     } 

DATABASE_VERSION应该为2

+0

感谢Femi回复。DATABASE_VERSION是一个公共变量,它在DDMS透视图的onUpgrade show 1和2中的log.d语句处被初始化... – Rupin 2011-05-27 14:54:38

+0

因此,升级可能会失败。在'finally'之前放一个'catch'语句,看看会发生什么:你可能需要在'alter table'语句末尾删除分号,并且可能引用'IS_READ'值。 – Femi 2011-05-27 14:57:59

+0

费米是正确的,你的升级可能会失败,这就是为什么你的版本停留在1.添加一个catch并记录任何异常。 – dmon 2011-05-27 15:16:33

相关问题