简单易用的安卓SharedPreferences存储(数据存储系列)

简单易用的安卓SharedPreferences存储(数据存储系列)

本文正在参加「金石计划 . 瓜分6万现金大奖」

前言

本篇主要介绍本人在工作最常用的数据存储方法——haredPreferences存储,即sp存储,该方式存储比较方便,用于存储用户本地持久化数据,使用过程中也出现过一些不好解决的坑,但不可否认,如果需求有一些需要APP本地存储的数据,我还是会首选sp存储,毕竟写起来很容易(工作开发的项目代码已经将其简化封装为工具类,只要写key和set方法与get方法即可调用,所以感觉很方便)。

正篇

SharedPreferences存储概述

该存储方式是使用键值对(key-value)进行存储数据,换而言之,当我们想用其保存一条数据,需要给这条数据提供一个对应的键(key),然后在读取数据的时候就可以通过这个键(key)将相应的值(value)取出。

image.png 该存储方式支持多种不同的数据类型存储:

image.png

image.png 如上面两个图所示,该方法支持以下几种数据类型:
1.int(整型)
2.long(长整型)
3.float(浮点型)
4.String(字符串)
5.Set<String>(字符串集合)
存入以上对应的类型,我们在取出时也会获得同样类型的数据。

使用方法

存储数据

首先,我们看看sp存储的存数据方法:\

1.getSharedPreferences()方法

image.png

image.png 这个方法是Context类提供的,该方法的第一个参数可以用来指定文件名称,名称不存在就会创建一个,Sp存储文件存放地址为/data/data/< package name >/shared_prefs/目录下;它的第二个参数则是用于指定操作模式,不过只有MODE_PRIVATE这个默认模式可用,等于直接传入0,这个模式意思是只有当前程序才可以对这个Sp文件进行读写。

2.getPreferences()方法

这个方法是Activity类中提供的:

image.png 这个方法只有一个参数,即操作模式,而且该方法会将当前的Activity类名直接作为Sp文件名,其他都和getSharedPreferences()方法相似。

使用实例:

布局中我们加一个按钮 XML布局:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".SharedPreferencesDemo">

    <Button
        android:id="@+id/saveButton"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:backgroundTint="@color/default_a"
        android:text="@string/save_data"/>

</LinearLayout>
复制代码

然后在Activity中在按钮的点击事件时使用Sp存储存入元素:

class SharedPreferencesDemo : AppCompatActivity() {
    lateinit var binding : ActivitySharedPreferencesDemoBinding

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = ActivitySharedPreferencesDemoBinding.inflate(layoutInflater)
        setContentView(binding.root)
        binding.saveButton.setOnClickListener {
            val editor = getSharedPreferences("data", Context.MODE_PRIVATE).edit()
            editor.putString("name", "Tom")
            editor.putInt("age", 18)
            editor.putBoolean("married", false)
            editor.apply()
        }
        //Demo
        val edit = getPreferences(Context.MODE_PRIVATE).edit()
        edit.putLong("id", 5555555)
        edit.apply()
    }
}
复制代码

我们运行程序,然后按一下按钮:

image.png

接着我们就可以在设备文件管理器中找到data.xml的文件: image.png image.png 这就表示存下来了。

Sp文件读取数据方法

存储数据的时候我们用了putXXX()的方法,去存储了key-value型数据,所以取数据更为简单,就是直接去对应类型的getXXX()方法传入对应的key即可以取出该类型的数据,当然为了在找不到存储值时有对应的数据获取,我们在getXXX()的第二个参数中传入默认值,如下所示:

image.png

binding.restoreButton.setOnClickListener {
    val prefs = getSharedPreferences("data", Context.MODE_PRIVATE)
    val name = prefs.getString("name", "")
    val age = prefs.getInt("age", 0)
    val married = prefs.getBoolean("married", false)
    Log.d("Main", "name is $name, age is $age, married is $married")
}
复制代码

这样我们就能取出我们存储的数据,非常简单好用。

总结

虽然Sp存储现在已经有更好的技术去替换(MMKV),但Sp存储的原理还是需要我们去了解的,当然,作为安卓数据存储技术,它还是需要我们去熟练使用,这篇文章主要就是简单的介绍了Sp存储的基本使用方法,如果需要深入了解,还是去阅读源码最好,此外,后面我也会去学习MMKV,虽然目前接触项目还没有使用。