概述
SharedPreferences作為android開發中最常用的持久化存盤方案,非常適合屬性和配置的本地存盤(另外也可以使用本地檔案、資料庫的方式實作持久化),雖然SharedPreferences的使用較為方便,但是維護起來確非常的麻煩,我們很容易定義出冗余的配置,也可能會生成大量的組態檔,甚至我們沒有足夠的信心來確定,定義的屬性是否被重復定義(會導致隱晦bug),現基于Kotlin來進行面向物件API的封裝(使用到的技術有:類擴展、動態代理、注解等),
使用
gradle中配置
implementation 'com.zhangzheng.easystore:library:1.1.0'
Application初始化
EasyStore.init(this)
SharedPreferences的獲取需要通過Context,因為考慮到使用的簡便性,和后續的可擴展性,沒有采用在使用的時候傳遞Context的方式,
Demo示例
定義資料結構介面
interface TestStorage :Storable{
var name:String
var count:Int
var isBool:Boolean
}
在TestStorage組態檔中,配置了三個屬性,這里只需要定義介面,不需要具體的實作,用來描述存盤的資料結構
獲取資料
val loadFromLocal = TestStorage::class.load()
獲取單個資料
val name = TestStorage::class.get { name }
存盤資料
TestStorage::class.apply {
name = "2777777"
count = 100
isBool =false
}
TestStorage::class.commit {
name = "2777777"
count = 100
isBool =false
}
apply是異步的,通過這種方式我們可以有選擇的存盤資料,比如如果只想存盤name可以使用如下的方式:
TestStorage::class.commit { name = "2777777" } ,其他屬性并不會有變動,
擴展性
實際開發中,我們不僅僅會將配置存盤在SharedPreferences中,資料庫和檔案也是我們的選擇方式之一,對于這種情況我們可以自己進行擴展,如下:
class TestStoreBuilder : IStoreBuilder {
override fun build(storable: KClass<out Storable>, context: Context): IStore {
return TestStore()
}
private class TestStore:IStore{
override fun commit(values: Map<String, Any?>): Boolean {
}
override fun apply(values: Map<String, Any?>) {
}
override fun getAll(): Map<String, Any> {
}
}
}
使用方式
@Store(TestStoreBuilder::class)
interface TestStorage :Storable{
var name:String
var count:Int
var isBool:Boolean
}
說明
通過注解的方式來指定構造器,之所以采用這種方法來進行設計,一方面考慮通過抽象來屏蔽細節,開發者只需要定義配置資料結構而不需要關注實作,簡化使用難度;另外注解也無法傳遞實體,所以這里借助無構造引數的Builder來創建存盤策略,
最后
如果這篇文章對您有用,希望大家可以關注和點贊!這里獻上源代碼:https://github.com/long8313002/EasyStore
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/126558.html
標籤:AI
上一篇:解決ADB無法連接Android設備!原因:device unauthorized!
下一篇:2020-09-24
