一、概述

SharedPreferences是一种轻量级的数据存储方式,采用键值对的存储方式。

SharedPreferences只能存储少量数据,大量数据不能使用该方式存储,支持存储的数据类型有booleans, floats, ints, longs, and strings。

SharedPreferences存储到一个XML文件中的,路径在/data/data/<packagename>/shared_prefs/下,文件名以及存储后面详细讲述。

二、基本用法

1.获取SharedPreferences对象

要创建存储文件或访问已有数据,首先要获取SharedPreferences才能进行操作。获取SharedPreferences对象有下面两个方式:

(1)getSharedPreferences(String name, int mode) --- 通过Context调用该方法获得对象。它有两个参数,第一个name 指定了SharedPreferences存储的文件的文件名,第二个参数mode 指定了操作的模式。这种方式获取的对象创建的文件 可以被整个应用所有组件使用,有指定的文件名。

(2)getPreferences(int mode) --- 通过Activity调用获得对象。它只有一个参数mode 指定操作模式。这种方式获取的对象创建的文件 属于Activity,只能在该Activity中使用,且没有指定的文件名,文件名同Activity名字。

如:

mContextSp = this.getSharedPreferences( "testContextSp", Context.MODE_PRIVATE );
---创建的文件名是,testContextSp.xml
mActivitySp = this.getPreferences( Context.MODE_PRIVATE );
---创建的文件名是,MainActivity.xml(该Activity叫MainActivity)

操作模式(mode):

两个方式都有一个mode参数,mode具体有4个值,最新的只能使用默认模式 Context.MODE_PRIVATE。

Context.MODE_PRIVATE(0):默认模式,创建的文件只能由 调用的应用程序(或者共享相同用户ID的应用程序)访问

后面3种已不推荐使用。从下面文档说明中看到,这些情况的操作 最好使用ContentProvider, BroadcastReceiver, Service.

这些在前面四大组件中详细写过,最后面附上链接:

ContentProvider:https://www.cnblogs.com/fanglongxiang/p/11304243.html

BroadcastReceiver:https://www.cnblogs.com/fanglongxiang/p/11281466.html

Service:https://www.cnblogs.com/fanglongxiang/p/11113942.html

Context.MODE_WORLD_READABLE(1) 

Context.MODE_WORLD_WRITEABLE(2) 

Context.MODE_MULTI_PROCESS(4)

2.数据更新

SharedPreferences添加或更新数据,通过SharedPreferences 获取 SharedPreferences.Editor,操作文件数据,最后通过commit()或apply()提交修改。

如下:

SharedPreferences mContextSp = this.getSharedPreferences( "testContextSp", Context.MODE_PRIVATE );
SharedPreferences.Editor editor = mContextSp.edit();
editor.putInt( "age", 28);
editor.putBoolean( "isStudent", false );
editor.putString( "job", "it" );
editor.commit();

操作后,在对应应用路径下有创建testContextSp.xml。具体手机里的数据如下。

<?xml version='1.0' encoding='utf-8' standalone='yes' ?>
<map>
<string name="job">it</string>
<int name="age" value="28" />
<boolean name="isStudent" value="false" />
</map>

commit()和apply()区别:

apply()立即更改内存中的SharedPreferences对象,但异步地将更新写入磁盘。commit()同步地将数据写入磁盘。commit()是同步的,在主线程调用它应该多注意,因为可能引起阻塞,引起ANR。

commit()有返回值,返回是否成功写入永久性存储种。apply()没有返回值。

(3)数据获取。

通过SharedPreferences提供的getInt(),getString()等方法获取 文件中的数据,如果数据不存在,则返回一个默认值。

如:

mContextSp = this.getSharedPreferences( "testContextSp", Context.MODE_PRIVATE );
String name = mContextSp.getString( "name", "bbb" );
int age = mContextSp.getInt( "age", 0 );
boolean isStudent = mContextSp.getBoolean( "isStudent", false );

三、简单实例

一个Activity里3个按钮,AddData   UpdateData  getData,具体代码如下,让我们看看操作后手机中的数据变化。

MainActivity.java

import android.app.Activity;
import android.content.Context;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button; public class MainActivity extends Activity {
SharedPreferences mContextSp;
SharedPreferences mActivitySp; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate( savedInstanceState );
setContentView( R.layout.activity_main ); mContextSp = this.getSharedPreferences( "testContextSp", Context.MODE_PRIVATE );
mActivitySp = this.getPreferences( Context.MODE_PRIVATE );
mActivitySp.edit().commit();//only create file Button addBtn = findViewById( R.id.add_data_btn );
addBtn.setOnClickListener( new View.OnClickListener() {
@Override
public void onClick(View v) {
SharedPreferences.Editor editor = mContextSp.edit();
editor.putString( "name", "aaa" );
editor.putInt( "age", 18);
editor.putBoolean( "isStudent", true );
editor.commit();
}
} ); Button updateBtn = findViewById( R.id.update_data_btn );
updateBtn.setOnClickListener( new View.OnClickListener() {
@Override
public void onClick(View v) {
SharedPreferences.Editor editor = mContextSp.edit();
editor.putInt( "age", 28);
editor.putBoolean( "isStudent", false );
editor.putString( "job", "it" );
editor.commit();
}
} ); Button getDataBtn = findViewById( R.id.get_data_btn );
getDataBtn.setOnClickListener( new View.OnClickListener() {
@Override
public void onClick(View v) {
String name = mContextSp.getString( "name", "bbb" );
int age = mContextSp.getInt( "age", 0 );
boolean isStudent = mContextSp.getBoolean( "isStudent", false );
Log.d( "sp_test", "name="+name+";age="+age+";isStudent="+isStudent);
}
} );
}
}

布局文件activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"> <Button android:id="@+id/add_data_btn"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textAllCaps="false"
android:text="AddData"/> <Button android:id="@+id/update_data_btn"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textAllCaps="false"
android:text="UpdateData"/> <Button android:id="@+id/get_data_btn"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textAllCaps="false"
android:text="getData"/> </LinearLayout>

具体操作及现象:

启动应用,mActivitySp.edit().commit(); 通过getPreferences()获取的SharedPreferences对象 创建了一个不指定名称的xml文件,文件名同Activity名字,没写入任何数据。

点击AddData 添加数据, 然后点击getData 获取数据。

getData打印出的log:

2019-08-22 10:49:41.626 21272-21272/com.flx.testsharedpreferences D/sp_test: name=aaa;age=18;isStudent=true

获取的数据和手机中数据是一致的。 

 

点击UpdateData 更新数据,在点击getData 获取数据。

getData打印的数据:

2019-08-22 10:53:01.580 21272-21272/com.flx.testsharedpreferences D/sp_test: name=aaa;age=28;isStudent=false

  

Android_存储之SharedPreferences的更多相关文章

  1. Android数据存储之SharedPreferences及如何安全存储

    前言: 最近一直在学习ios的数据存储,当学习到NSUserDefaults的时候让我回想起了SharedPreferences,今天闲来无事,想着总结一下SharedPreferences的使用. ...

  2. Android数据存储方式--SharedPreferences

    Android数据存储方式有如下四种:SharedPreferences.存储到文件.SQLite数据库.内容提供者(Content provider).存储到网络服务器. 本文主要介绍一下Share ...

  3. Android入门(九)文件存储与SharedPreferences存储

    原文链接:http://www.orlion.ga/578/ Android系统中主要提供了三种方式用于简单地实现数据持久化功能,即文件存储.SharedPreference存储以及数据库存储.当然, ...

  4. Android数据存储-通过SharedPreferences实现记住密码的操作

    在Android中登陆中,为了实现用户的方便,往往需要根据用户的需要进行记住密码的操作,所以,在Android数据存储中SharedPreferences恰恰可以实现这一点 下面,小编将带领大家通过S ...

  5. Android 数据存储之 SharedPreferences储存

    ------------------------------------------SharedPreferences存储--------------------------------------- ...

  6. android-数据存储之SharedPreferences

    数据存储:SharedPreferences 一.基础概要 1.说明 1>主要用于存储单一小数据: 2>存储类型:boolean.float.String.long.int 3>数据 ...

  7. Android数据的四种存储方式SharedPreferences、SQLite、Content Provider和File (一) —— 总览

    Android数据的四种存储方式SharedPreferences.SQLite.Content Provider和File (一) —— 总览   作为一个完成的应用程序,数据存储操作是必不可少的. ...

  8. android数据存储之SharedPreferences

    一.SharedPreferences简介      (1)SharedPreferences是Android平台上一个轻量级的存储类,用来保存应用的一些常用配置,比如Activity状态,Activ ...

  9. Android数据存储三剑客——SharedPreferences、File、SQLite

    Android中常用的数据存储一般有三种方式:SharedPreferences.文件和SQLite数据库,用来保存需要长时间保存的数据.本文将通过几个具体的小实例来讲解这三种方式的具体实现. 数据存 ...

随机推荐

  1. 数学--数论--直角三角形--勾股数---奇偶数列法则 a^2+b^2=c^2

    先说勾股数: 勾股数,又名毕氏三元数 .勾股数就是可以构成一个直角三角形三边的一组正整数.勾股定理:直角三角形两条直角边a.b的平方和等于斜边c的平方(a²+b²=c²) 勾股数规律: 首先是奇数组口 ...

  2. TCP的三次握手四次挥手理解及面试题

    一.TCP概述 每一条TCP连接都有两个端点,这种端点我们叫作套接字(socket),它的定义为端口号拼接到IP地址即构成了套接字, 例如,若IP地址为192.0.0.1 而端口号为8000,那么得到 ...

  3. python sort和sorted的区别

    sort 与 sorted 区别: sort 是应用在 list 上的方法,使用方法为 list.sort(),是对原有列表进行操作,改变原有列表的排序: sorted 可以对所有可迭代的对象进行排序 ...

  4. 实现MapReduce

    简介 当我们要统计数亿文本的词频,单个机器性能一般,况且是数亿级数据,处理是十分缓慢的,对于这样的任务,希望的是多台电脑共同处理,大幅度减少任务时间.联合多台电脑一起工作的系统就是分布式系统. 最近在 ...

  5. 服务器安装JDK

    1.卸载OpenJDK, 安装OracleJDK a.一般的LINUX发行版内置OpenJDK, 相当于JDK的开源版本(我们平时使用的JDK特指OracleJDK) b.OpenJDK 不能使用ja ...

  6. springboot配置静态资源访问路径

    其实在springboot中静态资源的映射文件是在resources目录下的static文件夹,springboot推荐我们将静态资源放在static文件夹下,因为默认配置就是classpath:/s ...

  7. 认识mysql3个基本库

    一.3个基本库 数据库初始化安装完毕会有三个基本库mysql .information_schema.performace_schema.作为应用程序开发者,平时较少关注这些数据库尤其是后两者.但是通 ...

  8. 用PHP获取网页上的信息相对于xpath效率低点

    用php实现对网页的抓取,及信息的收集,其实就是爬数据,具体实现步骤如下,首先应引入两个文件curl_html_get.php和save_file.php文件,两个文件具体代码是这样的curl_htm ...

  9. qt-n个数组实现排列组合

    例如:现在有一批鞋子,其中颜色有[‘白色’,‘黑色’,‘灰色’]:大小有[‘40’,‘41’,‘42’],样式有[‘板鞋’,‘运动’,‘休闲’],要求写一个算法,实现[[‘白色’,‘40’,‘板鞋’] ...

  10. [hdu4888]最大流,判断最大流唯一性

    题意:给一个n*m的矩形,往每个格子填0-k的数字,使得对第i行和为row[i],第i列和为col[i],问是否存在方案,方案是否唯一,如果方案唯一则输出具体方案. 思路:首先根据问题提取对象,行.列 ...