在 Android 中如果遇到需要長期把持的資料,會有三種方案可以選擇
沒有說誰好誰爛,只有適不適合的問題,例如不會希望把比較複雜的結構化資料存在 SharedPeference ,而會希望用 SQL 或是 Json File 的方式處理掉
接下來就一一介紹
SharedPreference 通常會存在 /data/data/[app packageName]/shared_prefs/
之下
那他的優點有
File 的話就很直觀是檔案,不論是 圖片、影片、PDF、下載的APK 等等,都會是以 File 的型式儲存
講到 File 的儲存就要補充一下 Android 的 Storage ,在 Android 下, Storage 也分為三種,分別是
Internal Storage 是只要目前 App 能夠存取的區域,其他 App 或是使用者都不能直接接觸到的空間,路徑通常會是 data/data/[app packageName]
裏面會包含像是 App 的 Config
、SharedPreference
、SQLite
等等。因為這個空間每個 App 都會有一個,因此站在 Android OS 的角度,就不會劃分太多的空間給某個 App ,只會是比較重要的檔案才會存在這個空間裏面,其他比較大型的檔案就會希望存在 External Storage
另外因為這個空間只專屬給對應的 App 持有,因此當使用者把 App 刪掉時,這個空間裏面的資料自然就會跟著被回收掉
Primary External Storage 是 OS 從裝置的 Storage 劃分出來的一個區塊,專門儲存從 App 中產出的圖片、影片、音檔等等,在這個空間的檔案也是可以提供給其他程式做使用
例如拍照軟體會把照片存到相簿,而修圖軟體可以到相簿中取得照片修圖,修完的圖可以在存回相簿中,讓其他程式去取用
另外需要注意的一點是在 App 要使用 External Storage 的檔案時,需要先取得 External Storage Permission 才能夠存取喔
因為手機以前的儲存空間都不大,因此人手一張 16G 的 SD 卡,才能在上學的時候偷偷聽音樂或看影片,那外接儲存空間都算是 Secondary External Storage, 目前很多手機容量越來越大再加上雲端空間就非常夠用,因此手機中也漸漸拿掉 SD card 插槽了( 時代的眼淚...
可能有些人會想說資料不都可以打 API 送到後端的 Database 做處理嗎?幹嘛在放一套資料在手機裏面,這樣不會很佔空間嗎?
其實這樣的看法對也不對,的確如果只是把 App 都做一種資料呈獻的手段,那其實 App 本身不需要握有太多數據,需要在打 API 去拿或是打 API 把生成出來的資料傳回去即可,但畢竟有些 App 是要考慮到使用者隱私或是要做到離線模式都能夠使用的,例如有些通訊軟體即使在沒有網路的狀態下,還是能看到一部份過去的聊天紀錄,這些可能就會是透過 SQLite
的方式暫且儲存起來,並且如果使用者在離線狀態下持續的發送訊息,那麼這些訊息會先 hold 在 SQLite
裏面,等到連上網路的時候在跟後端 Server 做 Sync
,因此手機裡面有 SQLite
還是非常重要的
那麼 SQLite
主要的優點就如同以下列出來的
但 SQLite 因為追求小而巧,因此有省略掉一些部份,造成令人詬病的問題,例如
因為以上的問題,因此 Google 在 I/O 2018 的時候發表 Andorid Jetpack 時,在 Jetpack 中推出了 Google 官方支援的 SQL ORM - Room ,Room 改正了幾項問題
看到這邊是不是很想要學 Room 了呢?
總結一下今天的部份,今天是複習 Android 中三種資料儲存的方案,以及 Internal Storage 與 External Storage 的差別,並且在介紹 SQLite 的時候也順勢帶到了明天會介紹的 Room
那下面這張圖是 Google 給出的一張比較圖,幾乎所有上面提到的東西,這張圖都有概刮到,可以在看完上面在服用這張圖會更有感覺喔
如果內容有任何問題或錯誤,歡迎提出與指教