2011-04-16 151 views
13

我有一個運行着名爲ANIMAL的工作表的應用程序。首次創建此表時,它僅由_id和animal_name列組成。升級SQlite表時遇到困難

現在我想就可以擴大,包括animal_biography列,但我有一個小difficulty.At起初,我以爲我只是升級我的CREATE_TABLE語句,以包括動物生物的情況:

private static final String DATABASE_CREATE = 



      "create table " + ANIMALS_TABLE + 

      " (_id integer primary key autoincrement, " + 

      "animal_name text not null, " + 

      "biography text not null);"; 

然而,看着logcat它告訴我列傳記試圖插入它時不存在。現在

,我曾嘗試使用onUpgrade()和包括代碼

db.execSQL("ALTER TABLE" + DATABASE_NAME); 
db.execSQL(DATABASE_CREATE); 

到數據庫升級但這也不解決問題。有沒有人有任何關於如何解決這個問題的指針?

+0

好吧,我設法找到了解決這個問題。 我需要從應用程序中刪除數據庫,以便在啓動時使用修改的代碼創建一個全新的表,我刪除了數據庫,如下所示: File dbFile = getDatabasePath(「Path_Name」); dbFIle.delete(); – Jnanathan 2011-04-16 16:22:10

+0

只需使用DDMS文件瀏覽器即可刪除數據庫文件。 – GrAnd 2011-04-16 17:14:16

回答

52

如果您使用SQLiteOpenHelper升級表格很容易。您需要實施方法onCreateonUpgrade,並在類構造器中提供數據庫的當前版本。更新您的表時只需增加數據庫版本號,請在onCreate方法中指定新的表創建查詢,並將ALTER TABLE更改爲onUpgrade方法以更新以前版本的表。當Android檢測到數據庫版本不匹配時,它會自動調用onUpgrade方法。見例如:

public class OpenHelper extends SQLiteOpenHelper { 

    private final static int DB_VERSION = 2; 

    public TracksDB(Context context) { 
     super(context, DB_NAME, null, DB_VERSION); 
    } 

    @Override 
    public void onCreate(SQLiteDatabase db) { 
     final String CREATE_TBL = 
      "create table " + ANIMALS_TABLE + 
      " (_id integer primary key autoincrement, " + 
      "animal_name text not null, " + 
      "biography text not null);"; 
      db.execSQL(CREATE_TBL); 
    } 

    @Override 
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
     if (oldVersion < 2) { 
      final String ALTER_TBL = 
       "ALTER TABLE " + ANIMALS_TABLE + 
       " ADD COLUMN biography text not null;"; 
      db.execSQL(ALTER_TBL); 
     } 
    } 
} 

升級的這種方法是修改表,而不會丟失用戶數據的正確方法,尤其是在應用程序已經已經發布到公衆。

+0

很酷,謝謝讓事情更清晰。 – Jnanathan 2011-04-24 17:33:48

+1

@GrAnd - 感謝您的回答,這對我有很大的幫助。然而這個例子不起作用,因爲你不能添加「not null」列而沒有指定默認值,如: 「ADD COLUMN biography text not null default default_biography」 – Koger 2011-11-29 13:21:13

+1

我有同樣的問題,我已經實現了上面的方法,我更改了版本號,log/debug也顯示onUpgrade被調用,並且根本沒有異常(我假設它成功執行了查詢)。但是當我嘗試加載項目(目前沒有記錄,因爲我已經刪除表並重新創建)它仍然會拋出異常新列不存在。 卸載應用程序也不起作用。 – 2013-11-13 23:02:35