簡體   English   中英

通過刪除所有內容重新填充房間數據庫

[英]repopulating room database by deleting all the content

我現在完成了 android 代碼實驗室,關於帶有 MVVM 拱門的房間 db。 但是有一部分我並不完全理解。 這是codelab中的一句話:

要在創建應用程序時刪除所有內容並重新填充數據庫,您將創建一個 RoomDatabase.Callback 並覆蓋 onCreate()。

這是他們提供的代碼:

private class WordDatabaseCallback(
    private val scope: CoroutineScope
) : RoomDatabase.Callback() {

    override fun onCreate(db: SupportSQLiteDatabase) {
        super.onCreate(db)
        INSTANCE?.let { database ->
            scope.launch {
                populateDatabase(database.wordDao())
            }
        }
    }

    suspend fun populateDatabase(wordDao: WordDao) {
        // Delete all content here.
        wordDao.deleteAll()
    }
}

我不明白的部分是“刪除所有內容”。 為什么我需要在創建應用程序時刪除所有內容? “無論何時創建應用程序”是什么意思? 是第一次安裝應用程序還是每次打開應用程序?

當我不使用此代碼時,該應用程序也可以正常工作。 有人可以解釋刪除所有內容的目的嗎?

為什么我需要在創建應用程序時刪除所有內容?

您不需要,這是一個特定場景,無論出於何種原因,您都希望應用程序刪除存儲在數據庫中的所有內容。 但是無論如何都不應該有任何內容,因為僅在數據庫實際不存在時才調用onCreate (除非手動調用),因此不會有要刪除的內容。

  • 如果您使用.createFromAsset使用預打包的數據庫,則不會調用onCreate

  • 我相信他們剛剛包含了一個簡單的、不太可能失敗的使用回調的介紹。

“無論何時創建應用程序”是什么意思? 是第一次安裝應用程序還是每次打開應用程序?

前者。 這就是數據庫的全部目的是長期存儲數據。 因此,數據庫存儲在應用程序的數據空間中。 安裝應用程序時,數據空間將沒有數據庫。 所以 App 和 Room 必須知道在使用之前創建數據庫。

所以當你嘗試使用數據庫時,准備使用數據庫的處理會檢查數據庫是否存在。

  • 如果數據庫確實存在,那么它會繼續運行而不調用onCreate

  • 如果數據庫不存在,Room 將嘗試通過onCreate方法創建數據庫和其中的表。 Callback允許在此階段通過覆蓋onCreate方法進行干預。

  • 如果 App 停止並重新運行,數據庫仍然存在,並且不會調用onCreate

  • 如果 App 被卸載然后重新安裝,數據庫將被刪除,因此調用onCreate

  • 如果安裝了新版本的 App,那么數據庫仍然存在,不會調用onCreate

  • 如果安裝了新版本的應用程序並且它包含數據庫的新版本,則不會調用onCreate 相反,將采用指定的任何遷移路徑。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM