Kotlin笔记(54) — SharedPreferences

2021-02-09  本文已影响0人  奔跑的佩恩

前言

在android开发过程中,我们经常会用到数据存储的需求。那么今天就让我们来学习下SharedPreferences存储数据的知识

今天涉及知识有:

  1. SharedPreferences 简介
  2. 读写权限
  3. SharedPreferences之一般存储处理
  4. kotlin特性下SharedPreferences的使用
  5. SharedPreferences在Activity中使用代码
  6. 效果图和项目结构图
  7. ShareProperty类源码
  8. 需要注意的问题

先来波效果图


效果图.gif

一.SharedPreferences 简介

SharedPreferencesAndroid系统中文件类型的存储方式。数据在SharedPreferences中以key-value方式存储。
新建一个SharedPreferences对象,我们可以像下面这样:

var sps:SharedPreferences=context.getSharedPreferences("default",Context.MODE_PRIVATE)

这里需要注意的是,以上代码中第一个参数"default"表示当前SharedPreferences文件名为default.xml,第二个参数表示文件操作模式,一般用Context.MODE_PRIVATE表示私有模式。

二.读写权限

注:SharedPreferences存数是不需要添加文件读写相关权限的
但为了让程序更加健壮,我们最好在使用前添加文件读写相关权限。先是要在你项目的androidmainfast.xml中添加读写权限,如下:

    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

然后需要添加手动权限库,这里我使用的是PermissionsDispatcher,手动库的添加大家可以参考以下文章:
PermissionsDispatcher动态权限申请kotlin版
接着需要添加FileProvider相关处理,大家可参考以下文章
SpUtil多样加密存储,兼容android9.0

三.SharedPreferences之一般存储处理

SharedPreferences的一般存取与Java并无差别,下面以SharedPreferences存取String为例,封装一个ShareUtil工具类,贴出ShareUtil代码如下:

object ShareUtil {

    private var sps:SharedPreferences?=null

    private fun getSps(context: Context):SharedPreferences{
        if(sps==null){
            sps=context.getSharedPreferences("default",Context.MODE_PRIVATE)
        }
        return sps!!
    }

    fun putString(key:String,value:String?,context:Context){
        if(!value.isNullOrBlank()){
            var editor:SharedPreferences.Editor=getSps(context).edit()
            editor.putString(key,value)
            editor.commit()
        }
    }

    fun getString(key:String,context:Context):String?{
        if(!key.isNullOrBlank()){
            var sps:SharedPreferences=getSps(context)
            return sps.getString(key,null)
        }
        return null
    }
}

然后看看ShareUtilActivity中调用代码:

        LogUtil.i("====开始存储======")
        ShareUtil.putString("A", "大学", this@TempActivity)
        LogUtil.i("====存储完毕======")
        var value: String? = ShareUtil.getString("A", this@TempActivity)
        LogUtil.i("====获取值:$value")
        toast("====获取值:$value")

打印结果如下:

====开始存储======
====存储完毕======
====获取值:大学

四.kotlin特性下SharedPreferences的使用

kotlin相对Java的优势很多,在SharedPreferences上也得到了完美的体现。
这里我们用属性代理的知识封装了一个ShareProperty用于实现SharedPreferences基本数据类型的存储。下面看看ShareProperty存储和取值方法的使用:

        //从 SharedPreferences的文件中取key="A"的值,若没有则默认取值为 "小学"
        var name: String? by ShareProperty(this, "A", "小学")
        LogUtil.i("====取值:$name")

        //将 SharedPreferences文件中 key="A"的value值赋值为"幼稚园"
        name = "幼稚园"
        LogUtil.i("====存新值成功=====")

这里需要注意的是:利用var name: String? by ShareProperty(this, "A", "小学")可以直接获取key="A"的值,而直接给name赋值则相当于给SharedPreferences文件中存key="A",value= "幼稚园"的值。

五.SharedPreferences在Activity中使用代码

下面贴出SharedPreferences的两个工具类ShareUtilSharePropertyTempActivity中使用的代码:

class TempActivity :AppCompatActivity(){

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_temp)


        //点击事件
        mBtn.setOnClickListener{
            //测试ShareUtil的使用
            testShareUtil()
        }

        //点击事件
        mBtn2.setOnClickListener{
            //测试ShareProperty的使用
            testShareProperty()
        }

    }

    /**测试ShareUtil的使用**/
    private fun testShareUtil(){
        LogUtil.i("====开始======")
        LogUtil.i("====开始存储======")
        ShareUtil.putString("A", "大学", this@TempActivity)
        LogUtil.i("====存储完毕======")
        var value: String? = ShareUtil.getString("A", this@TempActivity)
        LogUtil.i("====获取值:$value")
        toast("====获取值:$value")
    }

    /**测试ShareProperty的使用**/
    private fun testShareProperty(){
        //取值
        var name: String? by ShareProperty(this, "A", "小学")
        LogUtil.i("====取值:$name")
        //存新值
        name = "幼稚园"
        LogUtil.i("====存新值成功=====")
        //再取值
        var name1: String? by ShareProperty(this, "A", "小学")
        LogUtil.i("====再取值:$name1")
        //验证值
        var namef: String? = ShareUtil.getString("A", this@TempActivity)
        LogUtil.i("====验证值:$namef")
    }

}

六.效果图和项目结构图

效果图.gif 项目结构图.png

七.ShareProperty类源码

下面给出利用属性代理实现SharedPreferences存取的工具类ShareProperty源码:

上一篇下一篇

猜你喜欢

热点阅读