前言
對于需要處理大量結構化資料的 App 來說,把這些資料做本地持久化會帶來很大的好處。常見的用例是緩存重要資料塊。這樣當裝置無法連網的時候,使用者仍然可以浏覽内容。而使用者對内容做出的任何改動都在網絡恢複的時候同步到服務端。
那麼 Room 又作為 Jetpack 包的一部分,是以我們就必須要掌握其内容;下面讓我們看看如何使用
首先,我們先講下開發中常用的一些資料庫知識
資料庫的4個基本知識介紹
資料(Data)
資料是資料庫中存儲的對象。描述事物的符号記錄稱為資料。資料和關于資料的解釋是不可分的。資料的解釋是指對資料含義的說明,資料的含義稱為資料的語義,資料與其語義是不可分的。
資料庫(DataBase,DB)
資料庫是長期存儲在計算機内、有組織、可共享的大量資料的集合。資料庫中的資料按一定的資料模型組織、描述、存儲,具有較小的備援度、較高的資料獨立性和易擴充性,并可為各種使用者共享。資料庫中的資料具有永久存儲、有組織和可共享三個基本特點。
資料庫管理系統(DataBase Management System,DBMS)
資料庫管理系統在資料庫建立、運用和維護時對資料庫進行統一控制,以保證資料的完整性和安全性,并在多使用者同時使用資料庫時進行并發控制,在發生故障後對資料庫進行恢複。
資料庫管理系統是位于使用者和作業系統之間的一層資料管理軟體。用于科學的組織和存儲資料,高效的擷取和維護資料。主要功能:
- 資料定義功能(資料定義語言,DDL)
- 資料組織、存儲和管理
- 資料操縱功能(資料操縱語言,DML)
- 資料庫的事務管理和運作管理
- 資料庫的建立和維護
- 其他功能
資料庫系統(DataBase System,DBS)
資料庫系統是由資料庫、資料庫管理系統、應用程式和資料庫管理者(DataBase Administrator,DBA)組成的存儲、管理、處理和維護資料的系統。
Room 架構
Room 持久性庫在 SQLite 的基礎上提供了一個抽象層,讓使用者能夠在充分利用 SQLite 的強大功能的同時,獲享更強健的資料庫通路機制。Room架構由 Google 官方維護。進行資料庫操作時,官方推薦使用 Room。
Room主要由三個部分組成,使用注解辨別資料庫操作。具體操作 SQL 的代碼可以不用寫,編譯時自動生成:
- 資料庫:包含資料庫持有者,并作為應用已保留的持久關系型資料的底層連接配接的主要接入點。使用@Database注解辨別。一個類在使用@Database注解時,應當注意以下三點:
- 是 RoomDatabase 抽象類的子類。
- 在注解中添加與資料庫關聯的實體清單(Entity,辨別資料庫中的表)。
- 包含抽象方法,該抽象方法具有 0 個參數,且傳回使用@Dao注解的類。
在運作時,可以通過調用 Room.databaseBuilder()或 Room.inMemoryDatabaseBuilder() 擷取Database執行個體對象。
- Entity:表示資料庫中的表。使用@Entity辨別
- DAO:包含用于通路資料庫的方法。使用@DAO辨別
- @Insert:插入操作
- @Delete:删除操作
- @Update:更新操作
- @Query:查詢操作
下面是一張官方的說明圖,說明上面三個元件之間的關系
我們先來舉一個簡單的例子,講講 Room 架構如何使用。假設我們要存儲一次打卡記錄。打卡記錄以時間戳存儲。通常的時間戳,我們會精确到毫秒。但這可能是不夠的。因為存在機器打卡的情況,是以需要更加精确的時間戳。Java 8 的新版時間 API 就采用了 秒 + 秒内納秒 的形式。一個 CPU 指令執行的最小時間也得幾十納秒。是以精确到納秒是綽綽有餘的。
對于類型的選擇,我們知道,Java 中,int 是用 4 個位元組表示,最大值為 2147483647 (2^31-1,21億多),而 1 秒等于 10 億納秒(1 * 1000(毫秒) * 1000(微秒) * 1000(納秒)),是以用 int 來存儲納秒是可行的。
Room 架構特性
Room 架構中資料庫的比對是以主鍵進行比對的,包括增、删、改,其傳回結果也是資料項的主鍵。查詢操作可以不用主鍵比對,但得自定義 SQL 語句
下面是 Room 中用到的一些常用注解的總結:
- @Database:資料庫類的辨別,使用entities屬性标記資料庫中的表,使用version屬性辨別資料庫版本
- @Entity:資料庫表的辨別,使用tableName指定資料表的名稱,使用primaryKeys指定資料表中的聯合主鍵
- @PrimaryKey:資料表中主鍵字段的辨別
- @ColumnInfo:資料表中字段的辨別,使用name指定字段名稱
- @Ignore:當某個字段或者方法不想映射到資料表中時,可以使用此注解,取消映射關系
- @Dao:Dao 操作類的辨別注解
- @Insert:資料表資料插入操作的辨別,使用onConflict屬性指定插入沖突時的政策,政策存在OnConflictStrategy類中
- @Delete:資料表資料删除操作的辨別
- @Query:資料表資料查詢操作的辨別。查詢時需要輸入 SQL 語句,":"用于充當模版字元串的辨別
- @Update:資料表資料更新操作的辨別
- @Embedded:可以在資料庫中使用内嵌對象
Room 預設生成的Dao實作類代碼是線程安全的,如不放心,可自己調用資料庫的事務操作,保證線程安全
Room 架構入門基本概念就到這裡了,更多 Android Jetpack 相關的技術知識文檔:可以私信發送 "進階" 即可 免費擷取
好了,以上就是今天要分享的内容,大家覺得有用的話,可以點贊分享一下;如果文章中有什麼問題歡迎大家指正;歡迎在評論區或背景讨論哈~