Android最优雅SharedPreferences封装(Kotlin版本)

935 阅读2分钟

概述

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来创建存储策略。

最后

如果这篇文章对您有用,希望大家可以关注和点赞!这里献上源代码:github.com/long8313002…