DataStore是Android Jetpack中的一个组件,它是一个数据存储的解决方案,跟SharedPreferences一样,采用key-value形式存储。DataStore支持Kotlin协程和Flow操作,如果当前使用SharedPreferences,可以考虑迁移到DataStore。Jetpack DataStore 是经过改进的新版数据存储解决方案,旨在取代 SharedPreferences,让应用能够以异步、事务方式存储数据。跟SharedPreferences一样,它比较适合小数据和简单操作,如果不是,应该使用数据库存储。
DataStore提供了两种不同实现方式,Preferences DataStore和Proto DataStore。Preferences DataStore不需要预先定义,但是不支持类型安全。Proto DataStore需要预先使用protocol buffers定义数据,但是类型安全。下面有三者之间的比较,该图片作者Florina Muntenescu。
下面开始介绍DataStore的基本用法
Protocol Buffers v3.14.0的下载地址,以windows 64位环境为例,选择protoc-3.14.0-win64.zip下载。下载完成后解压,将protoc-3.14.0-win64bin的绝对路径添加到系统环境变量中。如果添加到系统环境变量中,可以点此网址:WINDOWS如何配置Path环境变量。打开命令行工具,输入protoc --version查看版本成功,则表示配置成功。
>protoc --versionlibprotoc 3.14.0 3.2 新建.proto文件在项目的app/src/main/proto/路径下新建user.proto文件,第一行一定要写上syntax,选择proto版本,不能是空白行。
打开命令行工具,输入格式如下
protoc -I=$SRC_DIR --java_out=$DST_DIR $SRC_DIR/addressbook.proto例如:
protoc -I=项目路径appsrcmainproto --java_out=项目路径appsrcmain 项目路径appsrcmainprotouser.proto执行完后,将会在java目录com.hs.datastoresample.data.bean.user包下自动生成三个文件。
3.4 创建DataStore object UserSerializer: Serializer<User> { override val defaultValue: User get() = User.getDefaultInstance() override fun readFrom(input: InputStream): User { try { return User.parseFrom(input) }catch (e: InvalidProtocolBufferException){ throw CorruptionException("Cannot read proto.", e) } } override fun writeTo(t: User, output: OutputStream) { t.writeTo(output) } } val dataStore = context.createDataStore( fileName = FILENAME, serializer = UserSerializer ) 3.5 Set操作 dataStore.updateData { it.toBuilder() .setUsername(name) .build() } 3.6 Get操作 val getName = dataStore.data .map { it.username }最后附上完整代码的Github地址:DataStoreSample,如果觉得不错的话,欢迎Star。