android jetpack DataStore(java)代替SharedPreferences

本文介绍了AndroidDataStore中的PreferencesDataStore和ProtoDataStore的使用方法,包括导入依赖、创建DataStore实例、读取和写入数据。PreferencesDataStore适用于键值存储,而ProtoDataStore支持自定义数据类型。文章详细讲解了.proto文件的创建、Serializer的实现以及如何通过RxJava进行数据操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

DataStore 提供两种不同的实现:Preferences DataStore 和 Proto DataStore。

  • Preferences DataStore 使用键存储和访问数据
  • Proto DataStore 将数据作为自定义数据类型的实例进行存储

Preferences DataStore 怎么用?

导入依赖

 implementation "androidx.datastore:datastore-preferences:1.1.1"

        // optional - RxJava2 support
 implementation "androidx.datastore:datastore-preferences-rxjava2:1.1.1"

创建 Preferences DataStore

        RxDataStore<Preferences> dataStore =
                new RxPreferenceDataStoreBuilder(this,"settings").build();

读取内容

  //获取key为open的值
  Preferences.Key<Integer> EXAMPLE_COUNTER = PreferencesKeys.intKey("open");

 dataStore
         .data()
         .map(new Function<Preferences, Integer>() {
              @Override
              public Integer apply(Preferences preferences) throws Exception {

                        Integer integer = preferences.get(EXAMPLE_COUNTER);
                        return integer;
               }})
               .subscribe(new Consumer<Integer>() {
              @Override
                    public void accept(Integer integer) throws Exception {

                    }
                });

写入内容

        Single<Preferences> updateResult = dataStore.updateDataAsync(prefsIn -> {
            MutablePreferences mutablePreferences = prefsIn.toMutablePreferences();
            mutablePreferences.set(EXAMPLE_COUNTER, 1);
            return Single.just(mutablePreferences);
        });

Proto DataStore怎么用?

导入依赖

    implementation "androidx.datastore:datastore:1.0.0"
    implementation "androidx.datastore:datastore-rxjava2:1.0.0"

创建proto

  1. 在 app/src/main/proto/ 目录下添加.proto 文件
    在这里插入图片描述
    创建.proto文件
// 使用proto3
syntax = "proto3";
//      改为自己的包名
option java_package = "cn.jn.mytest";
option java_multiple_files = true;

//内容定义 UserPreferences 为类名
//字段格式为  类型 字段名 = 编号 ,编号需要唯一。
message UserPreferences {
    string name = 1;
    int32 age = 2;
    float weight = 3;
    float tall = 4;
    int32 sex = 5;
}

添加插件,识别.proto文件
在这里插入图片描述

  1. 配置编译proto

配置编译插件

plugins {
	.........
    id 'com.google.protobuf' version '0.9.4' apply false
}

引入插件

plugins {
	......
    id 'com.google.protobuf'
}

导入编译依赖

    implementation "com.google.protobuf:protobuf-javalite:3.14.0"

配置build.gradle(app)

android {
	.......
    protobuf {
        protoc {
            artifact = 'com.google.protobuf:protoc:3.8.0'
        }
        generateProtoTasks {
            all().each { task ->
                task.builtins {
                    java {
                        option "lite"
                    }
                }
            }
        }
    }

}
  1. 编译生成所需要的文件
    在这里插入图片描述

创建Serializer

创建Serializer,T是.proto文件定义类型。

    private static class UserSerializer implements Serializer<UserPreferences> {

        @Override
        public UserPreferences getDefaultValue() {
            return UserPreferences.getDefaultInstance();
        }

        @Nullable
        @Override
        public Object readFrom(@NonNull InputStream inputStream, @NonNull Continuation<? super UserPreferences> continuation) {

            try {
                return UserPreferences.parseFrom(inputStream);
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
        }

        @Nullable
        @Override
        public Object writeTo(UserPreferences userPreferences, @NonNull OutputStream outputStream, @NonNull Continuation<? super Unit> continuation) {
            try {
                userPreferences.writeTo(outputStream);

                return userPreferences;
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
        }
    }

使用DataStore

   RxDataStore<UserPreferences> dataStore =
                new RxDataStoreBuilder<>(this, "user.pb", new UserSerializer()).build();

读取数据

        //从 Proto DataStore 读取内容
        dataStore.data().map(UserPreferences::getName).subscribe(new Consumer<String>() {
            @Override
            public void accept(String s) throws Exception {

                Log.d("UserPreferences", "Name:" + s);
            }
        });

写入数据

        //将内容写入 Proto DataStore
        dataStore.updateDataAsync(userPreferences -> Single.just(userPreferences.toBuilder().setName("XX").build()))
                .subscribe(new Consumer<UserPreferences>() {
                    @Override
                    public void accept(UserPreferences userPreferences) throws Exception {

                    }
                }, new Consumer<Throwable>() {
                    @Override
                    public void accept(Throwable throwable) throws Exception {

                    }
                });
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值