Android_存储之SharedPreferences
一、概述
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的更多相关文章
- Android数据存储之SharedPreferences及如何安全存储
前言: 最近一直在学习ios的数据存储,当学习到NSUserDefaults的时候让我回想起了SharedPreferences,今天闲来无事,想着总结一下SharedPreferences的使用. ...
- Android数据存储方式--SharedPreferences
Android数据存储方式有如下四种:SharedPreferences.存储到文件.SQLite数据库.内容提供者(Content provider).存储到网络服务器. 本文主要介绍一下Share ...
- Android入门(九)文件存储与SharedPreferences存储
原文链接:http://www.orlion.ga/578/ Android系统中主要提供了三种方式用于简单地实现数据持久化功能,即文件存储.SharedPreference存储以及数据库存储.当然, ...
- Android数据存储-通过SharedPreferences实现记住密码的操作
在Android中登陆中,为了实现用户的方便,往往需要根据用户的需要进行记住密码的操作,所以,在Android数据存储中SharedPreferences恰恰可以实现这一点 下面,小编将带领大家通过S ...
- Android 数据存储之 SharedPreferences储存
------------------------------------------SharedPreferences存储--------------------------------------- ...
- android-数据存储之SharedPreferences
数据存储:SharedPreferences 一.基础概要 1.说明 1>主要用于存储单一小数据: 2>存储类型:boolean.float.String.long.int 3>数据 ...
- Android数据的四种存储方式SharedPreferences、SQLite、Content Provider和File (一) —— 总览
Android数据的四种存储方式SharedPreferences.SQLite.Content Provider和File (一) —— 总览 作为一个完成的应用程序,数据存储操作是必不可少的. ...
- android数据存储之SharedPreferences
一.SharedPreferences简介 (1)SharedPreferences是Android平台上一个轻量级的存储类,用来保存应用的一些常用配置,比如Activity状态,Activ ...
- Android数据存储三剑客——SharedPreferences、File、SQLite
Android中常用的数据存储一般有三种方式:SharedPreferences.文件和SQLite数据库,用来保存需要长时间保存的数据.本文将通过几个具体的小实例来讲解这三种方式的具体实现. 数据存 ...
随机推荐
- POJ 2955 区间DP必看的括号匹配问题,经典例题
Brackets Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 14226 Accepted: 7476 Description ...
- 图论--边双连通V-DCC缩点
// tarjan算法求无向图的割点.点双连通分量并缩点 #include<iostream> #include<cstdio> #include<cstring> ...
- 洛谷P1122 最大子树和 树形DP初步
小明对数学饱有兴趣,并且是个勤奋好学的学生,总是在课后留在教室向老师请教一些问题.一天他早晨骑车去上课,路上见到一个老伯正在修剪花花草草,顿时想到了一个有关修剪花卉的问题.于是当日课后,小明就向老师提 ...
- K. Road Widening
\(考虑每个区域可行的区间\) \(x[1]=s[1]\ \ y[1]=s[1]+g[1]\) \(x[i]=max(x[i-1]-1,s[i]),y[i]=min(y[i-1]+1,s[i]+g[i ...
- java23种设计模式——泡MM版
一.创建型模式 1.FACTORY:追MM少不了请吃饭了,麦当劳的鸡翅和肯德基的鸡翅都是MM爱吃的东西,固然口味有所不同,但不管你带MM往麦当劳或肯德基,只管向服务员说;来四个鸡翅就行了.麦当劳和肯德 ...
- python学习之变量以及变量/标识符/关键字
Python成为一门易读.易维护,并且被大量用户所欢迎的.用途广泛的语言,代码简洁,功能强大,是使程序员能够专注于解决问题而不是研究语言本身.接下来我们先从它的语法开始学起 1.首先要懂得python ...
- 【Kafka】CAP理论以及CAP定律
目录 CAP理论 概述 Consistency Availability Partition Tolerance CAP理论 概述 1988年,加州大学计算机科学家Eric Brewer 提出了分布式 ...
- 【基础】excel如何根据数据内容显示不同颜色。
需求: 店柜完成率排名相比上阶段升降,升显示绿色“↑“,降显示红色“↓”,持平显示黑色“-”. 步骤: 第一步 先计算两次排名的差值(本次排名-上次排名). 第二步 对差值列设置单元格格式,设置格式如 ...
- Mysql 常用函数(11)- trim 函数
Mysql常用函数的汇总,可看下面系列文章 https://www.cnblogs.com/poloyy/category/1765164.html trim 的作用 删除字符串左右两侧的空格 tri ...
- 01python基础入门
一.了解python 1.总结一句话:简单易用,相对于java易学,容易上手.如果你不知道学什么语言或者先入门的话,这个是首选, 毕竟小学生也开始学了.对你有用或者是你的爱好就坚定的开始学吧! 2.下 ...