Android DataStore用法介绍

DataStore是Android Jetpack中的一个组件,它是一个数据存储的解决方案,跟SharedPreferences一样,采用key-value形式存储。DataStore支持Kotlin协程和Flow操作,如果当前使用SharedPreferences,可以考虑迁移到DataStoreJetpack DataStore 是经过改进的新版数据存储解决方案,旨在取代 SharedPreferences,让应用能够以异步、事务方式存储数据。跟SharedPreferences一样,它比较适合小数据和简单操作,如果不是,应该使用数据库存储。

DataStore提供了两种不同实现方式,Preferences DataStoreProto DataStorePreferences DataStore不需要预先定义,但是不支持类型安全。Proto DataStore需要预先使用protocol buffers定义数据,但是类型安全。下面有三者之间的比较,该图片作者Florina Muntenescu

Android DataStore用法介绍_第1张图片
下面开始介绍DataStore的基本用法

1. 导入依赖

    // Preferences DataStore
    implementation "androidx.datastore:datastore-preferences:1.0.0-alpha04"
    // Proto DataStore
    implementation  "androidx.datastore:datastore-core:1.0.0-alpha04"
    implementation "com.google.protobuf:protobuf-java:3.14.0"

2. Preferences DataStore

2.1 创建DataStore

    val dataStore: DataStore = context.createDataStore(
    	name = "user"
    )

2.2 Set操作

    val NAME = preferencesKey("username")    
    dataStore.edit {
    	it[NAME] = name
    }

2.3 Get操作

    val getName = dataStore.data
    .map {
    	it[NAME]
    }

3. Proto DataStore

3.1 配置proto环境

Protocol Buffers v3.14.0的下载地址,以windows 64位环境为例,选择protoc-3.14.0-win64.zip下载。下载完成后解压,将protoc-3.14.0-win64\bin的绝对路径添加到系统环境变量中。如果添加到系统环境变量中,可以点此网址:WINDOWS如何配置Path环境变量。打开命令行工具,输入protoc --version查看版本成功,则表示配置成功。

>protoc --version
libprotoc 3.14.0

3.2 新建.proto文件

在项目的app/src/main/proto/路径下新建user.proto文件,第一行一定要写上syntax,选择proto版本,不能是空白行。
Android DataStore用法介绍_第2张图片

syntax = "proto3";

option java_package = "com.hs.datastoresample.data.bean.user";
option java_multiple_files = true;

message User{
  string username = 1;
}

3.3 编译Protocol Buffers

打开命令行工具,输入格式如下

protoc -I=$SRC_DIR --java_out=$DST_DIR $SRC_DIR/addressbook.proto

例如:

protoc -I=项目路径\app\src\main\proto\ --java_out=项目路径\app\src\main\ 项目路径\app\src\main\proto\user.proto

执行完后,将会在java目录com.hs.datastoresample.data.bean.user包下自动生成三个文件。

Android DataStore用法介绍_第3张图片

3.4 创建DataStore

    object UserSerializer: Serializer {

        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。

你可能感兴趣的:(Android,android,kotlin,jetpack)