DataJPA之Repository接口">SpringDataJPA之Repository接口
1205
2022-05-29
一、DataStore 介紹
DataStore 是 Android Jetpack 中的一個組件,它是一個數據存儲的解決方案,跟 SharedPreferences 一樣,采用key-value形式存儲。DataStore 保證原子性,一致性,隔離性,持久性。尤其是,它解決了 SharedPreferences API 的設計缺陷。Jetpack DataStore 是經過改進的新版數據存儲解決方案,旨在取代 SharedPreferences,讓應用能夠以異步、事務方式存儲數據。
注意:DataStore 比較適合小數據和簡單操作,并且無法局部的更新數據。如果你需要支持大型或復雜的數據集、部分更新或引用完整性,請考慮使用 Room 而不是 DataStore。
Preferences DataStore 和 Proto DataStore
Preferences DataStore:與SharedPreferences類似,通過鍵值對存儲數據,此實現不需要預定義模式,也不提供類型安全。
Proto DataStore:通過Protocol-Buffers定義存儲數據類型以及結構,保證類型安全。
一、DataStore 介紹
DataStore 是 Android Jetpack 中的一個組件,它是一個數據存儲的解決方案,跟 SharedPreferences 一樣,采用key-value形式存儲。DataStore 保證原子性,一致性,隔離性,持久性。尤其是,它解決了 SharedPreferences API 的設計缺陷。Jetpack DataStore 是經過改進的新版數據存儲解決方案,旨在取代 SharedPreferences,讓應用能夠以異步、事務方式存儲數據。
注意:DataStore 比較適合小數據和簡單操作,并且無法局部的更新數據。如果你需要支持大型或復雜的數據集、部分更新或引用完整性,請考慮使用 Room 而不是 DataStore。
Preferences DataStore 和 Proto DataStore
Preferences DataStore:與SharedPreferences類似,通過鍵值對存儲數據,此實現不需要預定義模式,也不提供類型安全。
Proto DataStore:通過Protocol-Buffers定義存儲數據類型以及結構,保證類型安全。
本文重點了解Preferences DataStore。
二、Preferences DataStore
與SharedPreferences類似,通過鍵值對存儲數據,此實現不需要預定義模式,也不提供類型安全。
2.1 添加依賴
在你項目的app_module對應的build.gradle中添加如下依賴:
dependencies { //Typed DataStore (Typed API surface, such as Proto) implementation "androidx.datastore:datastore:1.0.0" // //可選 - RxJava2 support // implementation "androidx.datastore:datastore-rxjava2:1.0.0" // //可選 - RxJava3 support implementation "androidx.datastore:datastore-rxjava3:1.0.0" //Preferences DataStore (SharedPreferences like APIs) implementation "androidx.datastore:datastore-preferences:1.0.0" // // 可選 - RxJava2 support // implementation "androidx.datastore:datastore-preferences-rxjava2:1.0.0" // // 可選 - RxJava3 support implementation "androidx.datastore:datastore-preferences-rxjava3:1.0.0" }
2.2 使用 Preferences DataStore 存儲鍵值對
首先看看 DataStore 源碼,DataStore 是一個接口。
package androidx.datastore.core import kotlinx.coroutines.flow.Flow import java.io.IOException /** * DataStore數據存儲提供了一種安全、持久的方式來存儲少量數據,如 preferences 和應用程序狀態。 * 數據存儲提供了ACID保證。它是線程安全的,并且不阻塞。特別是,它解決了SharedReferences API的這些設計缺陷: * 1. Synchronous API encourages StrictMode violations * 2. apply() and commit() have no mechanism of signalling errors * 3. apply() will block the UI thread on fsync() * 4. Not durable – it can returns state that is not yet persisted * 5. No consistency or transactional semantics * 6. Throws runtime exception on parsing errors * 7. Exposes mutable references to its internal state */ public interface DataStore
以上可以看出 DataStore 是基于 協程 和 Flow 實現的。
data 是一個 Flow 對象。
updateData() 用于更新對象。
并且查看 DataStore 的其他相關源碼你會發現他們都是基于Kotlin語言開發。Google 對于推 Kotlin 那是相當執著。
2.2.1 創建 DataStore
使用 preferencesDataStore(Kotlin) 創建Datastore
如果你使用 RxJava,要使用 RxPreferenceDataStoreBuilder。
必需的 name 參數是 Preferences DataStore 的名稱。
這里我們使用的是RxJava:
RxDataStore
默認路徑:/data/data/com.scc.datastorage/files/datastore/datastore_sc.preferences_pb
這里創建了兩個key,分別是 String 類型和 Int 類型。
2.2.1 DataStore 寫入數據
//關于 nameKey 和 ageKey 請看上面代碼。 putString(nameKey, "name-Scc"); putInteger(ageKey, 25); //2022/1/25 功能:存入String類型的數據 private void putString(Preferences.Key
這里寫入的兩種類型,這樣更加仿版理解和你寫成自己的工具類,因為使用 DataStore 比較少實踐少就不提供工具類了,以免誤導大家。
2.2.3 DataStore 讀取數據
getString(nameKey); getInteger(ageKey); //2022/1/25 功能:獲取String類型數據 private void getString(Preferences.Key
三、Proto DataStore
通過Protocol-Buffers定義存儲數據類型以及結構,保證類型安全。
Proto DataStore 實現使用 DataStore 和 Protocol-Buffers 將類型化對象持久保存到磁盤。
什么是 Protocol-Buffers?
Protocol-Buffers是谷歌的語言中立、平臺中立、可擴展的機制,用于序列化結構化數據——比如XML,但更小、更快、更簡單。您只需定義一次數據的結構化方式,然后就可以使用特殊生成的源代碼,輕松地在各種數據流之間以及使用各種語言編寫和讀取結構化數據。
3.1 定義架構
Proto DataStore 需要app/src/main/proto/目錄中的 proto 文件中的預定義模式。此架構定義了您在 Proto DataStore 中持久保存的對象的類型。
syntax = "proto3"; option java_multiple_files = true; option java_package = "com.scc.datastorage.proto"; option java_outer_classname = "User"; message User{ string name = 1; int32 age = 2; }
.proto 文件以包聲明開頭,這有助于防止不同項目之間的命名沖突。
java_multiple_files:可以為每個生成的類生成一個單獨的 .java 文件。
java_package:指定生成的類應該使用什么 Java 包名稱。如果您沒有明確指定,它只會匹配包聲明給出的包名。
java_outer_classname:定義了類名。如果沒有設置這個 options ,它將通過將文件名轉換為大寫駝峰式來生成。例如,默認情況下,“my_proto.proto”將使用“MyProto”作為包裝類名稱。
定義 message:
可以使用許多標準的簡單數據類型可用作字段類型,包括 bool、int32、float、double 和 string。
可以使用許多標準的簡單數據類型可用作字段類型,包括 bool、int32、float、double 和 string。
還可以通過使用其他 message 類型作為字段類型來為你的消息添加進一步的結構。
還可以通過使用其他 message 類型作為字段類型來為你的消息添加進一步的結構。
每個元素上的 "= 1"、"= 2" 標記標識該字段在二進制編碼中使用的唯一 "tag"。
更多關于 的內容可以去官網找找 protobuf 語言指南。
注意:存儲對象的類是在編譯時從 proto 文件中定義的message生成的。確保你 rebuild 你的項目。
3.2 創建 Proto DataStore
1.定義一個實現 Serializer
2.使用 dataStore 創建的屬性委托來創建 DataStore
寫到這里 proto 文件中定義的類無法生成,也嘗試了很多辦法,不知道什么情況。后續步驟可參照官網,其他方法和Preferences DataStore類似。就不占用篇幅了。
相關鏈接
官方文檔 DataStore;
個人感覺 DataStore 還是沒有 SP 和 MMKV 好用,推薦使用 MMKV 畢竟上線好幾年了,而且是大廠推出,相對穩定一些,有些個人自己實現了 SP 的功能,但是萬一有 Bug 或者突然不繼續維護了是不是就尷尬了。
Android Java
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。