一、概述
SharedPreferences 和 MMKV 都是Android平臺(tái)保存本地?cái)?shù)據(jù)的工具,用于保存一些常用配置。
二、SharedPreferences
1.類(lèi)似Map集合,將Key-Value對(duì)存儲(chǔ)于硬盤(pán)上的XML文件,以XML文件的形式保存在/data/data/包名/shared_prefs目錄下。數(shù)據(jù)較多時(shí)會(huì)有性能問(wèn)題。
2.SharedPreferences適用于簡(jiǎn)單數(shù)據(jù)的存儲(chǔ),對(duì)于復(fù)雜且相互間有關(guān)的數(shù)據(jù),則更適合保存在數(shù)據(jù)庫(kù)。
3.支持基本數(shù)據(jù)類(lèi)型和StringSet類(lèi)型數(shù)據(jù)的存儲(chǔ)。
4.SharedPreferences保存在APP內(nèi)部,當(dāng)手動(dòng)清除應(yīng)用數(shù)據(jù)時(shí),保存的數(shù)據(jù)會(huì)被清除掉。
5.類(lèi)似于Windows系統(tǒng)上的ini配置文件,但具有權(quán)限設(shè)置:Context.MODE_PRIVATE(只能被本應(yīng)用訪問(wèn)),Context.MODE_APPEND(追加模式),Context.MODE_WORLD_READABLE(其他應(yīng)用可讀),Context.MODE_WORLD_WRITEABLE(其他應(yīng)用可寫(xiě))。
6.ContextImpl 記錄著 SharedPreferences的重要數(shù)據(jù)、文件路徑和實(shí)例的鍵值對(duì)。
7.在 XML 文件全部?jī)?nèi)加載到內(nèi)存中之前,讀取操作是阻塞的。在 XML 文件全部?jī)?nèi)加載到內(nèi)存中之后,是直接讀取內(nèi)存中的數(shù)據(jù)。
8.apply() 是異步的所以沒(méi)有返回值, 而commit()是同步的且有返回值因而能知道修改是否成功。
9.多并發(fā)的提交 commit() 時(shí),需等待正在進(jìn)行的 commit ()數(shù)據(jù)更新到磁盤(pán)文件后才會(huì)繼續(xù)往下執(zhí)行,從而降低效率。 而 apply ()只是原子更新到內(nèi)存,后調(diào)用 apply ()函數(shù)會(huì)直接覆蓋前面內(nèi)存數(shù)據(jù),從而一定程度上很大的提高了效率。
10.不是線(xiàn)程安全的。
11.不自帶加密功能。
12.不自帶多進(jìn)程共享,除非通過(guò)自定義ContentProvider等方式實(shí)現(xiàn),但實(shí)現(xiàn)復(fù)雜且性能低下。
三、MMKV
1.基于Key-Value存儲(chǔ)的跨平臺(tái)通用數(shù)據(jù)持久化庫(kù),基于mmap(內(nèi)存映射文件),適用于Android、iOS、macOS、Linux和Windows平臺(tái)。
2.設(shè)計(jì)初衷是為了解決傳統(tǒng)SharedPreferences在數(shù)據(jù)量較大時(shí)讀寫(xiě)效率低下的問(wèn)題,并提供比SQLite更簡(jiǎn)單和更高性能的API。
3.通過(guò)內(nèi)存映射文件mmap(Memory Mapped File)存儲(chǔ)Key-Value對(duì)和高效的編解碼算法,將數(shù)據(jù)直接映射到內(nèi)存中,避免了數(shù)據(jù)的序列化和反序列化過(guò)程,實(shí)現(xiàn)了極高的讀寫(xiě)性能。
4.只將數(shù)據(jù)映射到內(nèi)存中,不需要將數(shù)據(jù)全部讀入內(nèi)存,內(nèi)存占用較低。
5.底層序列化和反序列化使用Protobuf實(shí)現(xiàn),性能高且穩(wěn)定。
6.支持常用數(shù)據(jù)類(lèi)型及byte[]、StringSet、實(shí)現(xiàn)了Parcelable/Serializable接口的類(lèi)型等數(shù)據(jù)類(lèi)型的存取。
7.支持對(duì)存儲(chǔ)內(nèi)容進(jìn)行加密(AES加密機(jī)制)。
8.特別適合于需要頻繁讀寫(xiě)大量數(shù)據(jù)且對(duì)性能要求較高的場(chǎng)景,非常適合于替代Android中的SharedPreferences和iOS中的NSUserDefaults。
9.支持多線(xiàn)程操作,是線(xiàn)程安全的,底層使用了鎖機(jī)制。
10.支持多進(jìn)程共享且效率較高,提供了進(jìn)程鎖來(lái)保證數(shù)據(jù)一致性。
微風(fēng)不燥,陽(yáng)光正好,你就像風(fēng)一樣經(jīng)過(guò)這里,愿你停留的片刻溫暖舒心。
我是程序員小迷(致力于C、C++、Java、Kotlin、Android、iOS、Shell、JavaScript、TypeScript、Python等編程技術(shù)的技巧經(jīng)驗(yàn)分享),若作品對(duì)您有幫助,請(qǐng)關(guān)注、分享、點(diǎn)贊、收藏、在看、喜歡,您的支持是我們?yōu)槟峁椭淖畲髣?dòng)力。
歡迎關(guān)注。助您在編程路上越走越好!