2017-06-28 50 views
6

我有一種情況,我希望能夠使用Android Room對我的數據庫進行硬重置。使用SQLiteOpenHelper,我可以通過編寫一個方法來刪除所有表和索引,然後手動調用SQLiteOpenHelper.onCreate()如何在Android房間中完全重建我的數據庫?

我知道我可以通過房間訪問SupportSQLiteOpenHelper並自己放下所有的表格,但似乎沒有一種開啓娛樂過程的好​​方法。

此外,我知道我可以從每個表中刪除每個項目而不刪除它,但這不是我想要的。這不會重置自動遞增主鍵,因此新項目的「id」字段將不會重置爲1.

謝謝!編輯:
這是我想在運行時能夠任意做的事。

編輯2:
該方法應該是可維護的,即不涉及手寫與房間行爲相匹配的SQL。理想情況下,可以通過檢索 Room生成的SQL或SQLiteOpenHelper.onCreate()等效方法。或者其他解決這個問題的東西! :)

+0

這是一個功能請求,而不是現在有人可以解決的問題,除了房間開發人員。我也需要這個功能! –

回答

1

簡單的答案是增加您的@數據庫版本號。一般來說,您應該爲模式更改執行此操作,但它會實現您清除數據庫和重置所有主鍵值的目標。

@Database(entities = { Hello.class }}, version = 1) // <- you want to increase version by 1 
@TypeConverters({}) 
public abstract class AppDatabase extends RoomDatabase { 
    public abstract HelloDao helloTextDao(); 
} 

編輯:如果你想在運行時要做到這一點,我會清除你的表中的所有數據(以避免FK問題),然後調用DROP TABLE table_name,在所有各表的。然後,您將需要編寫查詢來創建表格,即:CREATE TABLE table_name (uid INTEGER PRIMARY KEY, name STRING);

這將意味着您必須維護一個創建表查詢的列表,以便您的POJO不幸與其保持最新狀態。理想情況下,您可以使用反射來生成查詢,howerever @ColumnInfo目前不支持反射,因爲它的RetentionPolicy設置爲CLASS

希望這可以解決您的問題,請隨時在評論中要求進一步澄清。快樂狩獵!

+2

是的,我相信這將完成應用更新之間的任務。但是,我希望能夠在運行時任意地執行此操作(我可以使用我描述的刪除所有表並調用onCreate())的'舊'方法來做到這一點。我已更新我的問題以反映這一點。 – GreysonP

+0

希望我的更新答案解決了這個問題。 –

+0

嘿,我明白這是一個可能的解決方案。不幸的是,我不認爲這是可以接受的。手動編寫SQL重新創建Room自動爲您生成的內容是災難的祕訣。小的差異可能會產生可怕的錯誤。使用「舊」方法,我可以保證調用onCreate()將完全按照原樣重新創建表。我無法保證在這裏。我想我希望能以某種方式訪問​​Room的等效onCreate()方法或其他一些硬重置方法? – GreysonP

相關問題