Android 数据保存 - SharedPreferences

2024-06-21 15:32

本文主要是介绍Android 数据保存 - SharedPreferences,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

参考:

保存数据:https://developer.android.com/training/basics/data-storage/index.html


在应用过程中,可能会产生多种不同类型的数据,有些数据需要重复使用。Android 系统提供了多种方式来保存数据,包括使用 SharedPreferences API 保存共享首选项,保存本地文件以及数据库操作


主要内容

  1. SharedPreferences API
  2. SharedPreferencesUtil.java

SharedPreferences API

参考:

保存键值集

使用共享首选项

SharedPreferences

SharedPreferences API 可以 保存和检索原始数据类型的永久性键值对

原始数据类型包括

  • 布尔值
  • 浮点值
  • 整型值
  • 长整型
  • 字符串

获取 SharedPreferences 对象

创建新的共享首选项文件或访问现有的文件,可通过以下两种方法:

  • getSharedPreferences() — 如果您需要按照您用第一个参数指定的名称识别的多个共享首选项文件,请使用此方法。您可以从您的应用中的 任何 Context 调用此方法
  • getPreferences() — 如果您只需使用 Activity 的一个共享首选项,请从 Activity 中使用此方法。 因为此方法会检索属于该 Activity 的默认共享首选项文件,您无需提供名称

方法一:

/*** Retrieve and hold the contents of the preferences file 'name', returning* a SharedPreferences through which you can retrieve and modify its* values.  Only one instance of the SharedPreferences object is returned* to any callers for the same name, meaning they will see each other's* edits as soon as they are made.** @param name Desired preferences file. If a preferences file by this name* does not exist, it will be created when you retrieve an* editor (SharedPreferences.edit()) and then commit changes (Editor.commit()).* @param mode Operating mode.  Use 0 or {@link #MODE_PRIVATE} for the* default operation.** @return The single {@link SharedPreferences} instance that can be used*         to retrieve and modify the preference values.** @see #MODE_PRIVATE*/
public abstract SharedPreferences getSharedPreferences(String name, int mode);

参数 name 表示共享首选项文件名,如果不存在该共享首选项文件,则新建

参数 mode 表示文件操作模式,使用 0 或者 Context.MODE_PRIVATE 表示仅本应用可访问

方法二:

/*** Retrieve a {@link SharedPreferences} object for accessing preferences* that are private to this activity.  This simply calls the underlying* {@link #getSharedPreferences(String, int)} method by passing in this activity's* class name as the preferences name.** @param mode Operating mode.  Use {@link #MODE_PRIVATE} for the default*             operation.** @return Returns the single SharedPreferences instance that can be used*         to retrieve and modify the preference values.*/
public SharedPreferences getPreferences(int mode) {return getSharedPreferences(getLocalClassName(), mode);
}

就是默认使用 Activity 名作为方法一中的 name

写入共享首选项

  • SharedPreferences 对象中调用方法 edit 得到 SharedPreferences.Editor

    /*** Create a new Editor for these preferences, through which you can make* modifications to the data in the preferences and atomically commit those* changes back to the SharedPreferences object.* * <p>Note that you <em>must</em> call {@link Editor#commit} to have any* changes you perform in the Editor actually show up in the* SharedPreferences.* * @return Returns a new instance of the {@link Editor} interface, allowing* you to modify the values in this SharedPreferences object.*/
    Editor edit();
    
  • 调用 SharedPreferences.Editor 中的方法输入键值对

    putBoolean(String key, boolean value)
    putFloat(String key, float value)
    putInt(String key, int value)
    putLong(String key, long value)
    putString(String key, String value)
    putStringSet(String key, Set<String> values)
    
  • 修改完成后,调用方法 commit() 提交

    /*** Commit your preferences changes back from this Editor to the* {@link SharedPreferences} object it is editing.  This atomically* performs the requested modifications, replacing whatever is currently* in the SharedPreferences.** <p>Note that when two editors are modifying preferences at the same* time, the last one to call commit wins.** <p>If you don't care about the return value and you're* using this from your application's main thread, consider* using {@link #apply} instead.** @return Returns true if the new values were successfully written* to persistent storage.*/
    boolean commit();
    

    Note:使用同一 name 检索得到的是同一个共享首选项文件,如果多个 Editor 同时编辑并提交,后面一个会覆盖前面的(这个是注释的内容,应该是说相同键的会覆盖)

  • 也可以使用方法 apply() 提交:

        /*** Commit your preferences changes back from this Editor to the* {@link SharedPreferences} object it is editing.  This atomically* performs the requested modifications, replacing whatever is currently* in the SharedPreferences.** <p>Note that when two editors are modifying preferences at the same* time, the last one to call apply wins.** <p>Unlike {@link #commit}, which writes its preferences out* to persistent storage synchronously, {@link #apply}* commits its changes to the in-memory* {@link SharedPreferences} immediately but starts an* asynchronous commit to disk and you won't be notified of* any failures.  If another editor on this* {@link SharedPreferences} does a regular {@link #commit}* while a {@link #apply} is still outstanding, the* {@link #commit} will block until all async commits are* completed as well as the commit itself.** <p>As {@link SharedPreferences} instances are singletons within* a process, it's safe to replace any instance of {@link #commit} with* {@link #apply} if you were already ignoring the return value.** <p>You don't need to worry about Android component* lifecycles and their interaction with <code>apply()</code>* writing to disk.  The framework makes sure in-flight disk* writes from <code>apply()</code> complete before switching* states.** <p class='note'>The SharedPreferences.Editor interface* isn't expected to be implemented directly.  However, if you* previously did implement it and are now getting errors* about missing <code>apply()</code>, you can simply call* {@link #commit} from <code>apply()</code>.*/
    void apply();
    

    如果在 UI 线程内操作并且不关心返回值,推荐使用方法 apply

    If you don’t care about the return value and you’re using this from your application’s main thread, consider using {@link #apply} instead.

清除共享首选项

获取 SharedPreferences.Editor 对象后,还可以调用其函数清除相对应的共享首选项:

    /*** Mark in the editor that a preference value should be removed, which* will be done in the actual preferences once {@link #commit} is* called.* * <p>Note that when committing back to the preferences, all removals* are done first, regardless of whether you called remove before* or after put methods on this editor.* * @param key The name of the preference to remove.* * @return Returns a reference to the same Editor object, so you can* chain put calls together.*/Editor remove(String key);

其返回一个新的 SharedPreferences.Editor 对象

如果想要全部清除可以调用函数 clear

    /*** Mark in the editor to remove <em>all</em> values from the* preferences.  Once commit is called, the only remaining preferences* will be any that you have defined in this editor.* * <p>Note that when committing back to the preferences, the clear* is done first, regardless of whether you called clear before* or after put methods on this editor.* * @return Returns a reference to the same Editor object, so you can* chain put calls together.*/Editor clear();

其同样返回一个新的 SharedPreferences.Editor 对象

Note:执行完清除动作后还需要进行提交操作,使用 apply 或者 commit 方法

读取共享首选项

获取 SharedPreferences 对象后,就可以调用函数进行读取

abstract Map<String, ?> getAll()
abstract boolean    getBoolean(String key, boolean defValue)
abstract float  getFloat(String key, float defValue)
abstract int    getInt(String key, int defValue)
abstract long   getLong(String key, long defValue)
abstract String getString(String key, String defValue)
abstract Set<String>    getStringSet(String key, Set<String> defValues)

调用函数 contains 可以判断是否存在该键值对:

/*** Checks whether the preferences contains a preference.* * @param key The name of the preference to check.* @return Returns true if the preference exists in the preferences,*         otherwise false.*/
boolean contains(String key);

接口

SharedPreferences 还包含了一个接口 SharedPreferences.OnSharedPreferenceChangeListener

/*** Interface definition for a callback to be invoked when a shared* preference is changed.*/
public interface OnSharedPreferenceChangeListener {/*** Called when a shared preference is changed, added, or removed. This* may be called even if a preference is set to its existing value.** <p>This callback will be run on your main thread.** @param sharedPreferences The {@link SharedPreferences} that received*            the change.* @param key The key of the preference that was changed, added, or*            removed.*/void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key);
}

SharedPreferences 对象调用函数 registerOnSharedPreferenceChangeListener 注册该接口后,当其 改变,增加或者移除 了某个键时,会调用该函数

示例:

public class MainActivity extends AppCompatActivity implements SharedPreferences.OnSharedPreferenceChangeListener {private static final String TAG = MainActivity.class.getSimpleName();@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);SharedPreferences sharedPreferences = getSharedPreferences("test", Context.MODE_PRIVATE);sharedPreferences.registerOnSharedPreferenceChangeListener(this);SharedPreferences.Editor editor = sharedPreferences.edit();editor.putString("key", "value");editor.commit();}@Overridepublic void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {Log.e(TAG, "onSharedPreferenceChanged: key = " + key);}
}

SharedPreferencesUtil.java

参考:消除unchecked cast Warning

封装 SharedPreferences 操作,方便日后使用

分为 4 个部分,构造函数,写入,删除,获取

可选择默认共享首选项文件,或者自定义共享首选项文件

完整代码如下:

import android.content.Context;
import android.content.SharedPreferences;import java.util.Set;/*** Created by zj on 2017/7/18.*/public class SharedPreferencesUtil {private static final String TAG = "SharedPreferencesUtil";// 获取 SharedPreferences 对象 --------------------------------private static SharedPreferences sharedPreferences;private static SharedPreferences getInstance(Context context) {if (sharedPreferences == null) {sharedPreferences = getSharedPreferences(context, TAG);}return sharedPreferences;}private static SharedPreferences getSharedPreferences(Context context, String name) {return context.getSharedPreferences(name, Context.MODE_PRIVATE);}// 写入 ---------------------------------------------------/*** 写入共享首选项,可写入 字符串 / 布尔值 / 整形 / 长整形 / 浮点型** @param context 上下文* @param key     键* @param value   值*/public static <T> void apply(Context context, String key, T value) {SharedPreferences sharedPreferences = getInstance(context);SharedPreferences.Editor editor = sharedPreferences.edit();if (value instanceof String) {editor.putString(key, String.valueOf(value));} else if (value instanceof Boolean) {editor.putBoolean(key, (Boolean) value);} else if (value instanceof Integer) {editor.putInt(key, (Integer) value);} else if (value instanceof Long) {editor.putLong(key, (Long) value);} else if (value instanceof Float) {editor.putFloat(key, (Float) value);}editor.apply();}/*** 写入共享首选项,可写入 字符串 / 布尔值 / 整形 / 长整形 / 浮点型** @param context 上下文* @param name    共享首选项文件名* @param key     键* @param value   值*/public static <T> void apply(Context context, String name, String key, T value) {SharedPreferences sharedPreferences = getSharedPreferences(context, name);SharedPreferences.Editor editor = sharedPreferences.edit();if (value instanceof String) {editor.putString(key, String.valueOf(value));} else if (value instanceof Boolean) {editor.putBoolean(key, (Boolean) value);} else if (value instanceof Integer) {editor.putInt(key, (Integer) value);} else if (value instanceof Long) {editor.putLong(key, (Long) value);} else if (value instanceof Float) {editor.putFloat(key, (Float) value);}editor.apply();}/*** 写入字符串集** @param context 上下文* @param key     键* @param values  值*/public static void applyStringSet(Context context, String key, Set<String> values) {SharedPreferences sharedPreferences = getInstance(context);SharedPreferences.Editor editor = sharedPreferences.edit();editor.putStringSet(key, values);editor.apply();}/*** 写入字符串集** @param context 上下文* @param name    共享首选项文件名* @param key     键* @param values  值*/public static void applyStringSet(Context context, String name, String key, Set<String> values) {SharedPreferences sharedPreferences = getSharedPreferences(context, name);SharedPreferences.Editor editor = sharedPreferences.edit();editor.putStringSet(key, values);editor.apply();}// 清除 ----------------------------------------------/*** 清除对应健值对** @param context 上下文* @param key     键*/public static void remove(Context context, String key) {SharedPreferences sharedPreferences = getInstance(context);SharedPreferences.Editor editor = sharedPreferences.edit();editor.remove(key);editor.apply();}/*** 清除对应健值对** @param context 上下文* @param name    共享首选项文件名* @param key     键*/public static void remove(Context context, String name, String key) {SharedPreferences sharedPreferences = getSharedPreferences(context, name);SharedPreferences.Editor editor = sharedPreferences.edit();editor.remove(key);editor.apply();}/*** 清空整个共享首选项文件** @param context 上下文*/public static void clear(Context context) {SharedPreferences sharedPreferences = getInstance(context);SharedPreferences.Editor editor = sharedPreferences.edit();editor.clear();editor.apply();}/*** 清空整个共享首选项文件** @param context 上下文* @param name    共享首选项文件名*/public static void clear(Context context, String name) {SharedPreferences sharedPreferences = getSharedPreferences(context, name);SharedPreferences.Editor editor = sharedPreferences.edit();editor.clear();editor.apply();}// 读取 --------------------------------------------/*** 读取共享首选项 ,可读取 字符串 / 布尔值 / 整形 / 长整形 / 浮点型** @param context  上下文* @param key      键* @param defValue 默认值* @return 值*/public static <T> T get(Context context, String key, T defValue) {SharedPreferences sharedPreferences = getInstance(context);T res = null;if (defValue instanceof String) {res = cast(sharedPreferences.getString(key, String.valueOf(defValue)));} else if (defValue instanceof Boolean) {res = cast(sharedPreferences.getBoolean(key, (Boolean) defValue));} else if (defValue instanceof Integer) {res = cast(sharedPreferences.getInt(key, (Integer) defValue));} else if (defValue instanceof Long) {res = cast(sharedPreferences.getLong(key, (Long) defValue));} else if (defValue instanceof Float) {res = cast(sharedPreferences.getFloat(key, (Float) defValue));}return res;}/*** 读取共享首选项 ,可读取 字符串 / 布尔值 / 整形 / 长整形 / 浮点型** @param context  上下文* @param name     共享首选项文件名* @param key      键* @param defValue 默认值* @return 值*/public static <T> T get(Context context, String name, String key, T defValue) {SharedPreferences sharedPreferences = getSharedPreferences(context, name);T res = null;if (defValue instanceof String) {res = cast(sharedPreferences.getString(key, String.valueOf(defValue)));} else if (defValue instanceof Boolean) {res = cast(sharedPreferences.getBoolean(key, (Boolean) defValue));} else if (defValue instanceof Integer) {res = cast(sharedPreferences.getInt(key, (Integer) defValue));} else if (defValue instanceof Long) {res = cast(sharedPreferences.getLong(key, (Long) defValue));} else if (defValue instanceof Float) {res = cast(sharedPreferences.getFloat(key, (Float) defValue));}return res;}/*** 读取字符串集** @param context   上下文* @param key       键* @param defValues 默认值* @return 值*/public static Set<String> getStringSet(Context context, String key, Set<String> defValues) {SharedPreferences sharedPreferences = getInstance(context);return sharedPreferences.getStringSet(key, defValues);}/*** 读取字符串集** @param context   上下文* @param name      共享首选项文件名* @param key       键* @param defValues 默认值* @return 值*/public static Set<String> getStringSet(Context context, String name, String key, Set<String> defValues) {SharedPreferences sharedPreferences = getSharedPreferences(context, name);return sharedPreferences.getStringSet(key, defValues);}// --------------------------------------------------------@SuppressWarnings("unchecked")private static <T> T cast(Object obj) {return (T) obj;}}

这篇关于Android 数据保存 - SharedPreferences的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/1081605

相关文章

如何使用C#串口通讯实现数据的发送和接收

《如何使用C#串口通讯实现数据的发送和接收》本文详细介绍了如何使用C#实现基于串口通讯的数据发送和接收,通过SerialPort类,我们可以轻松实现串口通讯,并结合事件机制实现数据的传递和处理,感兴趣... 目录1. 概述2. 关键技术点2.1 SerialPort类2.2 异步接收数据2.3 数据解析2.

大数据spark3.5安装部署之local模式详解

《大数据spark3.5安装部署之local模式详解》本文介绍了如何在本地模式下安装和配置Spark,并展示了如何使用SparkShell进行基本的数据处理操作,同时,还介绍了如何通过Spark-su... 目录下载上传解压配置jdk解压配置环境变量启动查看交互操作命令行提交应用spark,一个数据处理框架

通过ibd文件恢复MySql数据的操作方法

《通过ibd文件恢复MySql数据的操作方法》文章介绍通过.ibd文件恢复MySQL数据的过程,包括知道表结构和不知道表结构两种情况,对于知道表结构的情况,可以直接将.ibd文件复制到新的数据库目录并... 目录第一种情况:知道表结构第二种情况:不知道表结构总结今天干了一件大事,安装1Panel导致原来服务

Android WebView无法加载H5页面的常见问题和解决方法

《AndroidWebView无法加载H5页面的常见问题和解决方法》AndroidWebView是一种视图组件,使得Android应用能够显示网页内容,它基于Chromium,具备现代浏览器的许多功... 目录1. WebView 简介2. 常见问题3. 网络权限设置4. 启用 JavaScript5. D

Jmeter如何向数据库批量插入数据

《Jmeter如何向数据库批量插入数据》:本文主要介绍Jmeter如何向数据库批量插入数据方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Jmeter向数据库批量插入数据Jmeter向mysql数据库中插入数据的入门操作接下来做一下各个元件的配置总结Jmete

Android如何获取当前CPU频率和占用率

《Android如何获取当前CPU频率和占用率》最近在优化App的性能,需要获取当前CPU视频频率和占用率,所以本文小编就来和大家总结一下如何在Android中获取当前CPU频率和占用率吧... 最近在优化 App 的性能,需要获取当前 CPU视频频率和占用率,通过查询资料,大致思路如下:目前没有标准的

MySQL InnoDB引擎ibdata文件损坏/删除后使用frm和ibd文件恢复数据

《MySQLInnoDB引擎ibdata文件损坏/删除后使用frm和ibd文件恢复数据》mysql的ibdata文件被误删、被恶意修改,没有从库和备份数据的情况下的数据恢复,不能保证数据库所有表数据... 参考:mysql Innodb表空间卸载、迁移、装载的使用方法注意!此方法只适用于innodb_fi

mysql通过frm和ibd文件恢复表_mysql5.7根据.frm和.ibd文件恢复表结构和数据

《mysql通过frm和ibd文件恢复表_mysql5.7根据.frm和.ibd文件恢复表结构和数据》文章主要介绍了如何从.frm和.ibd文件恢复MySQLInnoDB表结构和数据,需要的朋友可以参... 目录一、恢复表结构二、恢复表数据补充方法一、恢复表结构(从 .frm 文件)方法 1:使用 mysq

mysql8.0无备份通过idb文件恢复数据的方法、idb文件修复和tablespace id不一致处理

《mysql8.0无备份通过idb文件恢复数据的方法、idb文件修复和tablespaceid不一致处理》文章描述了公司服务器断电后数据库故障的过程,作者通过查看错误日志、重新初始化数据目录、恢复备... 周末突然接到一位一年多没联系的妹妹打来电话,“刘哥,快来救救我”,我脑海瞬间冒出妙瓦底,电信火苲马扁.

golang获取prometheus数据(prometheus/client_golang包)

《golang获取prometheus数据(prometheus/client_golang包)》本文主要介绍了使用Go语言的prometheus/client_golang包来获取Prometheu... 目录1. 创建链接1.1 语法1.2 完整示例2. 简单查询2.1 语法2.2 完整示例3. 范围值