概述
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