2011-11-28 90 views
60

我有一個Android數據庫SQLite的問題。如何將新列添加到Android SQLite數據庫?

我有一個包含一個field.StudentFname 一個表和應用工作正常了Android 2.3.1,現在如果我添加一個字段,然後我的應用程序不能正常工作。

誰能幫我誰知道數據庫的非常好,

回答

146

您可以在onUpgrade()方法使用ALTER TABLE功能,像這樣:

@Override 
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
    // If you need to add a column 
    if (newVersion > oldVersion) { 
    db.execSQL("ALTER TABLE foo ADD COLUMN new_column INTEGER DEFAULT 0"); 
    } 
} 

顯然,SQLite的將根據列定義不同。

+1

喜!我已經嘗試過這我已用在upgrate方法和裏面,我已經把alter table查詢也是如此。但我仍然無法添加新的列到數據庫..但雅當我編寫查詢添加新列並重命名數據庫和表名都比我能夠添加新的列......但與alter table方法的幫助,我無法做到這一點..數據庫和表不是所需的任務..它應該與改變table..still我不能用alter table方法做到這一點.. – Aamirkhan

+0

如何增加值,如0,1,2,3,.......... – NagarjunaReddy

+0

@NagarjunaReddy對於遲到的回覆抱歉。 您可以使用此方法 db.execSQL(「UPDATE table SET key = key + 1 WHERE name =?」,new String [] {name}); – DevYudh

19

最簡單的方法是在SQLiteOpenHelper class中添加一些SQL to the onUpgrade()方法。喜歡的東西:

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

    // If you need to add a new column 
    if (newVersion > oldVersion) { 
     db.execSQL("ALTER TABLE student ADD COLUMN student_rollno INTEGER DEFAULT 0"); 
    } 
} 
+0

我已經嘗試過,但仍然無法通過使用alter table方法添加新列在upgrate方法。 – Aamirkhan

+0

嗨!我已經嘗試過這我已用在upgrate方法和裏面,我已經把alter table查詢也是如此。但我仍然無法添加新的列到數據庫..但雅當我編寫查詢添加新列並重命名數據庫和表名都比我能夠添加新的列......但與alter table方法的幫助,我無法做到這一點..數據庫和表不是所需的任務..它應該與改變table..still我不能用alter table方法做 – Aamirkhan

+0

如何增加值如自動增量0,1,2,3,.......... – NagarjunaReddy

3

@ Aamirkhan.i認爲你會解決你在評論中提到長回來ago.i認爲你並沒有增加數據庫的版本問題。否則這裏的答案是直截了當的。我正在寫這篇文章,因爲它可以幫助那些在更改表格時沒有增加或更改其數據庫版本號的人。

+0

是的,更改數據庫名稱和unistalling應用程序,並重新安裝它將解決問題 – Aamirkhan

+0

@Aamirkhan,請將支票移動到下一個答案,所以更清晰的解決方案是可用的公衆。 – AlleyOOP

17

當我在自己的應用程序上需要幫助時遇到了這個線程,但看到了許多答案的問題。我建議做以下幾點:

private static final String DATABASE_ALTER_TEAM_1 = "ALTER TABLE " 
    + TABLE_TEAM + " ADD COLUMN " + COLUMN_COACH + " string;"; 

private static final String DATABASE_ALTER_TEAM_2 = "ALTER TABLE " 
    + TABLE_TEAM + " ADD COLUMN " + COLUMN_STADIUM + " string;"; 

@Override 
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
    if (oldVersion < 2) { 
     db.execSQL(DATABASE_ALTER_TEAM_1); 
    } 
    if (oldVersion < 3) { 
     db.execSQL(DATABASE_ALTER_TEAM_2); 
    } 
} 

你要確保代碼將工作當用戶升級1個多版本和更新語句只運行一個升級是必要的。有關更多信息,請查看blog

+0

如果我們想用默認的String值創建更改的列,該怎麼辦? –

+3

我讀過的最好的解決方案和漂亮的博客btw! – MrBrightside

13

也許稍微更優雅的方式使用開關來代替的if/then將從任何模式到最近的模式升級...

這裏也對語法一個體面的頁面更改表:http://alvinalexander.com/android/sqlite-alter-table-syntax-examples

public static final String TABLE_TEAM = "team"; 
public static final String COLUMN_COACH = "coach"; 
public static final String COLUMN_STADIUM = "stadium"; 


private static final String DATABASE_ALTER_TEAM_TO_V2 = "ALTER TABLE " 
    + TABLE_TEAM + " ADD COLUMN " + COLUMN_COACH + " TEXT;"; 

private static final String DATABASE_ALTER_TEAM_TO_V3 = "ALTER TABLE " 
    + TABLE_TEAM + " ADD COLUMN " + COLUMN_STADIUM + " TEXT;"; 


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

    switch (oldVersion) 
    { 
     case 1: 
      //upgrade from version 1 to 2 
      db.execSQL(DATABASE_ALTER_TEAM_TO_V2); 
     case 2: 
      //upgrade from version 2 to 3 
      db.execSQL(DATABASE_ALTER_TEAM_TO_V3); 

     //and so on.. do not add breaks so that switch will 
     //start at oldVersion, and run straight through to the latest 

    } 

} 
+0

這是處理多個升級的方法。檢查哪個版本來自! – Ricardo

+0

如果您直接從版本1升級到版本3(如果有人不自動更新應用),則不會到達案例2. – TyMarc

+0

@ TyMarc--是的,它將升級到版本2,然後是3.交換機使用舊版本。因此,在您的示例中,舊版本爲1.代碼將運行第1種情況,即從版本1升級到第2版,然後運行第2種情況(因爲沒有中斷;),從2升級到3。在描述中,這些都是正確的。 –

2

我認爲我們不應該檢查類似的

if (newVersion > oldVersion) { 
} 

條件,因爲如果我們用這個,這意味着每次當我們增量值時間ASE數據庫版本,那麼onUpdrade()將調用和條件將是真實的,所以我們應該檢查這樣的

if(oldVersion==1) 
{ 

} 

所以在這種情況下,如果舊版本是2,那麼情況將是錯誤的和用戶與舊版本2將不更新數據庫(哪個用戶只想要版本1),因爲對於那些用戶數據庫已經更新。

0

我在搜索相同問題時遇到了鏈接。它解釋瞭如何使用升級。 https://thebhwgroup.com/blog/how-android-sqlite-onupgrade

它解釋了爲什麼使用這個下面的代碼

@Override 
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
     if (oldVersion < 2) { 
      db.execSQL(DATABASE_ALTER_TEAM_1); 
     } 
     if (oldVersion < 3) { 
      db.execSQL(DATABASE_ALTER_TEAM_2); 
     } 
    } 
0

最簡單的方法在表上創建一個新列添加一些SQL到SQLiteOpenHelper類onUpgrade()方法。像:

@Override 
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
    switch (oldVersion) { 
     case 1: 
      db.execSQL(SQL_MY_TABLE); 

     case 2: 
      db.execSQL("ALTER TABLE myTable ADD COLUMN myNewColumn TEXT"); 
    } 
} 
1

要添加一個新列到表中,您需要使用ALTER。在android中,您可以在onUpgrade()內添加新列。

您可能會奇怪,onUpgrade()將如何添加新列?

當您實現SQLiteOpenHelper的子類時,需要在您的類構造函數中調用超類的構造函數:super(context, DB_NAME, null, 1);。那裏我通過了1的版本。

當我將版本1更改爲以上(2或更高)時,將調用onUpgrade()。並執行我打算執行的SQL修改。 我的類的構造改變後的版本:像這樣

public DatabaseHelper(Context context) { 
    super(context, DB_NAME, null, 2);//version changed from 1 to 2 
} 

SQL的修改檢查,父類的構造與我傳遞給super()版本存儲的SQLite數據庫文件的版本進行比較。如果這些(先前和現在)版本號不同,則調用onUpgrade()

代碼應該是這樣的:

@Override 
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
    // add new columns to migrate to version 2 
    if (oldVersion < 2) { 
     db.execSQL("ALTER TABLE " + TABLE_NAME + "ADD COLUMN school VARCHAR(250)"); 
    } 
    // add new columns to migrate to version 3 
    if (oldVersion < 3) { 
     db.execSQL("ALTER TABLE " + TABLE_NAME + "ADD COLUMN age INTEGER"); 
    } 
} 
2

我做了以下的方法,它是來拆分爲我

如果DB版本:6

Ex : There is a table with 5 columns 

當你升級至:7(我在3張表中添加了1個新列)

1. We need to add the columns when creating a table 

2. onUpgrade method: 

if (oldVersion < 7) 
{ 
    db.execSQL(DATABASE_ALTER_ADD_PAPER_PAID); 
    db.execSQL(DATABASE_ALTER_LAST_UPLOADED); 
    db.execSQL(DATABASE_ALTER_PAPER_LABEL); 
} 

其中:「DATABASE_ALTER_ADD_PAPER_PAID」是查詢。

EX: public static final String DATABASE_ALTER_ADD_PAPER_PAID = "ALTER TABLE " 
       + TableConstants.MY_PAPERS_TABLE + " ADD COLUMN " + COLUMN_PAPER_PAID + " TEXT;"; 

上述後兩種操作它會正常工作的全新安裝的用戶和應用程序升級用戶

相關問題