美文网首页
Kotlin笔记(54) — SharedPreferences

Kotlin笔记(54) — SharedPreferences

作者: 奔跑的佩恩 | 来源:发表于2021-02-09 16:31 被阅读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源码:

    相关文章

      网友评论

          本文标题:Kotlin笔记(54) — SharedPreferences

          本文链接:https://www.haomeiwen.com/subject/lravtltx.html