前言
在android开发过程中,我们经常会用到数据存储的需求。那么今天就让我们来学习下SharedPreferences
存储数据的知识
今天涉及知识有:
- SharedPreferences 简介
- 读写权限
- SharedPreferences之一般存储处理
- kotlin特性下SharedPreferences的使用
- SharedPreferences在Activity中使用代码
- 效果图和项目结构图
- ShareProperty类源码
- 需要注意的问题
先来波效果图
效果图.gif
一.SharedPreferences 简介
SharedPreferences
是Android
系统中文件类型的存储方式。数据在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
}
}
然后看看ShareUtil
在Activity
中调用代码:
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
的两个工具类ShareUtil
和ShareProperty
在TempActivity
中使用的代码:
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
源码:
网友评论