我想自己通過遷移在空資料庫中顯式創建所有資料庫表。我怎樣才能做到這一點?
Room 總是使用物體類自己創建初始表。這是一種不可靠的方法。我無法控制架構,不得不依賴 Room。
uj5u.com熱心網友回復:
Room 總是使用物體類自己創建初始表。這是一種不可靠的方法。
事實上,它并非不可靠。然而,應該理解的是,當底層資料庫管理器 SQLite 沒有物件的概念,只有帶有列的表時,Room 是關于存盤和檢索物件的。因此 Room 必須能夠從一行或多行中的列創建物件(物體),因此必須滿足規則。如果遇到然后房間是相當可靠的。
我無法控制架構,不得不依賴 Room。
您可以通過對物體進行編碼來實作。但是,這些規則有限制,或者更正確地/正式地使用 SQLite。因此,您可以控制架構,但它必須遵守 Room 的規則/限制。
一個例子是列型別。
SQLite 對列型別有一種非常靈活的方法。因為幾乎任何東西都可以被接受為列型別。
然而,Room 必須知道如何存盤/提取物件(物體)。因此 Room 將列型別限制為INTEGER、TEXT、REAL或BLOB(SQLite 支持的 4 種型別)。Room 不支持包羅萬象的 NUMERIC 型別,也不支持 SQLite 通過SQLite 確定型別關聯的規則將其他列型別轉換為型別。
- Room 永遠不會接受定義為
timestamp DATE示例的列,因為 DATE 不是 INTEGER、TEXT、REAL 或 BLOB 之一(在 SQLite 中,DATE 決議為 NUMERIC 的型別關聯,一應俱全)。
- Room 永遠不會接受定義為
我想自己通過遷移在空資料庫中顯式創建所有資料庫表。我怎樣才能做到這一點?
簡而言之,請執行以下操作之一:
- 定義架構時遵循 Room 的規則,
- 聰明一點,讓 Room 完成作業(如下所述),或者
- 使用原生 SQLite 而不是 Room。
聰明的方法,因為你必須有物體,是創建物體和用@Database 注釋的類,然后編譯。這樣做將生成具有
expected架構的代碼。生成的代碼在生成的java中,通過Android Studio中的Android View可見。在類中,該類是用 @Database 注釋的類的名稱,后綴為_Impl。在createAllTables方法中是Room在創建表時使用的創建表SQL陳述句。這是 Room 所期望的并將遵守規則。然后就可以使用 Room 創建的 SQL 作為創建或修改表的基礎。
您可以在遷移中做很多事情。如果引入新表,則需要創建新表,因為遷移是通過一個未更改的資料庫。如果需要,根據 @Database 注釋中定義的物體,遷移的作業是更改資料庫并因此創建新表。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/375467.html
標籤:安卓 sqlite android-room
