SharedPreferences作為android開發中最常用的持久化儲存方案,非常適合屬性和設定的本地儲存(另外也可以使用本地檔案、資料庫的方式實現持久化)。雖然SharedPreferences的使用較為方便,但是維護起來確非常的麻煩,我們很容易定義出冗餘的設定,也可能會生成大量的組態檔,甚至我們沒有足夠的信心來確定,定義的屬性是否被重複定義(會導致隱晦bug)。現基於Kotlin來進行物件導向API的封裝(使用到的技術有:類擴充套件、動態代理、註解等)。
gradle中設定
implementation 'com.zhangzheng.easystore:library:1.1.0'
Application初始化
EasyStore.init(this)
SharedPreferences的獲取需要通過Context,因為考慮到使用的簡便性,和後續的可延伸性,沒有采用在使用的時候傳遞Context的方式。
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