2016-01-20 35 views
0

我正在使用Android和ORMLite。我是新手,我升級數據庫到版本2.我有類「自動」,需要刪除列別名。在ORMLite中更改架構時刪除列

@DatabaseTable(tableName = "Auto") 
public class Auto { 

    public static final String ALIAS     = "alias"; 
    public static final String PLACA     = "placa"; 


    @DatabaseField(generatedId = true, columnName = "ID") 
    private int id; 
    @DatabaseField(canBeNull = false, columnName = ALIAS) 
    private String alias; 
    @DatabaseField(canBeNull = false, columnName = PLACA) 

    public Auto() 
    { 
     //ORMLite needs a no-arg constructor 
    } 

    public Auto(String alias, String placa) { 
     this.alias     = alias; 
     this.placa     = placa; 
    } 

….. 
….. 
} 

我改變類自動爲...

@DatabaseTable(tableName = "Auto") 
public class Auto { 

    public static final String PLACA     = "placa"; 


    @DatabaseField(generatedId = true, columnName = "ID") 
    private int id; 
    @DatabaseField(canBeNull = false, columnName = PLACA) 

    public Auto() 
    { 
     //ORMLite needs a no-arg constructor 
    } 

    public Auto(String alias, String placa) {  this.placa     = placa; 
    } 

….. 
….. 
} 

我需要知道,如果ORMLite在執行「onUpgradeMethod」還是我不得不手動做這樣的自動刪除列別名。

@Override 
public void onUpgrade(SQLiteDatabase db, ConnectionSource connectionSource, int oldVersion, int newVersion) { 
    if(oldVersion == 1) { 
    try { 
     Dao dao; 
     dao = getAutoDao(); 
     dao.executeRaw("ALTER TABLE `Auto` DROP COLUMN alias;"); 

    } catch (SQLException e) { 
     Log.e(DatabaseHelper.class.getName(), "Error ", e); 

    } 
    } 
} 

回答

0

此鏈接幫助我解決它。

Drop column in SQLite

FAQ SQLite 11

Delete column from SQL

save data before table upgrade

Drop table if it already exists and then re-create it?

SQLite的有限ALTER TABLE支持,您可以使用添加一列放在表格的末尾或改變​​表格的名稱。如果您想在表格結構中進行更復雜的更改,則必須重新創建表格。您可以將現有數據保存到臨時表中,刪除舊錶,創建新表,然後將數據從臨時表中複製回來。

例如,假設你有一個名爲「T1」的列名 「A」,「B」表,「C」,而你想從這個 表中刪除列「C」。下面的步驟說明如何可以這樣做:

BEGIN TRANSACTION; 
CREATE TEMPORARY TABLE t1_backup(a,b); 
INSERT INTO t1_backup SELECT a,b FROM t1; 
DROP TABLE t1; CREATE TABLE t1(a,b); INSERT INTO t1 SELECT a,b FROM t1_backup; 
DROP TABLE t1_backup; 
COMMIT; 

根據菲爾的評論可能的解決方案是這樣的。 4

那麼你的選擇是:

  1. 假的東西,因爲他們,

  2. 添加新列,從舊到新複製所有數據作爲升級的一部分,完全忽略舊列,或者

  3. 使用刪除/創建策略進行升級:將表中的數據備份到臨時表中,刪除表,將其重新創建'd喜歡它 是,將所有的數據複製回來,最後放下臨時表 。

數據庫的升級總是緊張的事務(需要大量的錯誤 處理,大量的測試),坦率地說,如果該名稱爲 關注你,我就不要管它(選項1)的唯一的事情。如果您確實需要更改它,則選項2的風險較低,但會留下「死亡」列和數據。如果例如 數據是整個數據庫大小的重要百分比,那麼選項3可能是您的選擇。

我決定從列刪除的數據,但不刪除列,類似於解決方案2