2013-06-29 59 views
7

感謝您的閱讀和幫助:)如何添加一個新列

我使用後更新activeandroid表ActiveAndroid 3.0 - Android 2.2的 - 在我的應用程序我有一個名爲「用戶」的模式。最初我只創建了具有(id,名稱,密碼)列/屬性的模型,我在模擬器上運行了應用程序,並且它工作正常。

@Table(name = "user") 
public class User extends Model { 
    @Column (name = "name") 
    public String name; 
    @Column (name = "pass_code") 
    public String passCode; 
} 

然後我添加了一個新的列/屬性 - profileImage。我在模擬器上運行了應用程序,並且我得到了SQLite列profileImage不存在的錯誤。

@Table(name = "user") 
public class User extends Model { 
    @Column (name = "name") 
    public String name; 
    @Column (name = "pass_code") 
    public String passCode; 
    @Column (name = "profile_image") 
    public String profileImage; 
} 

我試着改變ActiveAndroid數據庫名稱和更新清單文件中的數據庫版本屬性。

<meta-data android:name="AA_DB_NAME" android:value="my_app.db" /> 
<meta-data android:name="AA_DB_VERSION" android:value="2" /> 

但我不斷收到列不存在的錯誤。

ERROR AndroidRuntime Caused by: android.database.sqlite.SQLiteException: 
no such column: profile_image: , while compiling: SELECT * FROM user WHERE profile_image = ? 

我也試過,未安裝從模擬器的應用程序,重新啓動仿真器,調用ActiveAndroid.cacheClear()。到目前爲止,沒有一個工作。

我真的很感激任何幫助。謝謝。

回答

19

從它的聲音中,您會錯過升級腳本以將您的user表遷移到新模式。升級腳本基本上包含有關如何從數據庫的舊狀態遷移到新狀態的說明。在你的具體情況下,你需要告訴SQLite它應該在現有的用戶表中添加一個新列profile_image

要將數據庫從模式1升級到2,請將AA_DB_VERSION的值提升爲2,併爲升級腳本命名爲2.sql。將文件保存assets/migrations下,給了以下內容:

ALTER TABLE user ADD profile_image TEXT; 

腳本可以包含任何一組可以通過SQLiteDatabase通過execSQL(...)被執行的SQL語句。

有關使用Active Android進行模式遷移的更多詳細信息,請參閱the wiki on the GitHub project page

+0

感謝您的幫助,非常感謝。 – dagger

+1

出於好奇,不應該刪除應用程序並重新安裝它有效嗎?或者,刪除應用程序不會刪除數據庫? –

+1

@JoshPinter:是的,卸載應用程序應該可以工作。事實上,點擊「清除數據」也應該做到這一點。但這不是一個長期的解決方案,因爲你可能不希望你的應用程序的用戶通過這個過程。正確的方法是提供適當的模式升級邏輯。 –

1

的「TEXT」的標籤更改爲「VARCHAR」使用ActiveAndroid

所有其他保留字數據庫遷移中強調,除了「TEXT」。我用「VARCHAR」,它的工作。