原创文章,转载请注明出处:http://www.cnblogs.com/baipengzhan/p/Android_SharedPreferences.html

一 概念

  SharedPreferences存储方式是Android中存储轻量级数据的一种方式。SharedPreferences存储主要用来存储一些简单的配置信息,内部以Map方式进行存储,因此需要使用键值对提交和保存数据,保存的数据以xml格式存放在本地的/data/data/<package name>/shares_prefs文件夹下。

二 特点

1,        使用简单,便于存储轻量级的数据;

2,        只支持Java基本数据类型,不支持自定义数据类型;

3,        SharedPreferences是单例对象,在整个应用内数据共享,无法在其他应用内共享数据;

三 注意事项

1,        SharedPreferences创建的时候使用的文件名不同,得到的对象不同,在存储位置会创建多个xml文件,不同文件名的SharedPreferences的数据不会共享;创建时采用相同的文件名,得到多个SharedPreferences引用,此时这多个引用共享同一个xml文件,它们操作的数据为相同的数据;

2,        针对数据的增删改查操作只有在提交后操作才能生效,此步骤最容易被忽略,当执行了对数据的操作后得不到需要的效果时,请查看是否没有提交操作。

3,        三种创建模式中最好采用MODE_PRIVATE,使用其他两种模式创建容易引起安全问题,就算采用MODE_PRIVATE,当别人活得root权限后也可能泄露用户的重要信息,因此建议使用SharedPreferences时,如果要存储用户名和密码时,不要明文存储,应该使用加密存储,防止重要隐私泄露,引起损失。

四 使用

1,        获得SharedPreferences对象

SharedPreferences对象必须使用上下文获得,使用时注意先要获得上下文。获得SharedPreferences对象方法为:

SharedPreferences sharedPreferences = getSharedPreferences(参数一, 参数二);

参数一为要保存的xml文件名,不同的文件名产生的对象不同,但同一文件名可以产生多个引用,从而可以保证数据共享。此处注意指定参数一时,不用加xml后缀,由系统自动添加。

参数二为创建模式,共有三个值:

MODE_PRIVATE

MODE_WORLD_READABLE

MODE_WORLD_WRITEABLE

第一个值使得SharedPreferences存储的数据只能在本应用内获得,第二个和第三个值分别使得其他应用可以读和读写本应用SharedPreferences存储的数据。由此可能带来安全问题,请参考本文二(3)部分。

2,        获得editor对象

使用以上获得的SharedPreferences对象产生editor,方法为:

Editor editor = sharedPreferences.edit();

3,        对数据实现增删改查

添加数据使用以下方法:

editor.putString(key, value);

可以实现数据的更新只需添加同键的键值对,和操作Map集合一样。

删除数据:

editor.remove(key);

删除参数部分键的键值对。

查询数据:

String result = sharedPreferences.getString(key1, key2);

Key1是要查询的键,返回对应的值,当键不存在时,返回key2作为结果。

清空数据

editor.clear();

注意:无论是否同一个sharedPreferences对象,若是产生多个editor,不同的editor之间对数据的操作不会相互影响,此处容易犯错误,例如,以下的程序:

sharedPreferences.edit().putString(key1, value1);

sharedPreferences.edit().putString(key2, value2);

sharedPreferences.edit().putString(key3, value3);

sharedPreferences.edit().commit();

执行后这种方式无法存储,因为sp.edit()每次都会返回一个新的Editor对象,Editor的实现类EditorImpl里面会有一个缓存的Map,最后commit的时候先将缓存里面的Map写入内存中的Map,然后将内存中的Map写进XML文件中。使用上面的方式commit,由于sp.edit()又重新返回了一个新的Editor对象,缓存中的Map是空的,所以导致数据无法被存储。这里即需要注意,只有提交时,不同的editor无法完成既定的任务。而增加,删除,更新,查询,若是同一个sharedPreferences产生的editor,则对共享的数据有效,会按照既定的顺序工作。而不同sharedPreferences产生的editor则因为处理的xml文件不同而不能共享数据。

再次强调:所有使用editor操作的数据,必须经过同一个editor提交即commit后才能生效。

五 Android实例

以下使用Android实例完成以上内容的验证:

1,        Activity界面和功能

(以下描述控件的顺序是布局中的由上到下)

保存数据功能:在第一个EditText中写入要保存的键,在第二个EditText中写入要保存对应键的值,点击第一个按钮则保存数据;

查询数据功能:在第三个EditText中写入要查询的键,点击第二个按钮查询数据,查询出的值显示在第一个TextView中;

删除数据功能:在第四个EditText中写入要删除的键,点击第三个按钮则删除键和值;

清空数据功能:点击第四个按钮则清空与editor对应的xml文件中的所有数据,但不会影响其他xml文件。

2,        主要代码

①MainActivity.java

package com.example.sharedpreferences;

import android.os.Bundle;
import android.app.Activity;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.text.Editable;
import android.view.Menu;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView; public class MainActivity extends Activity { private EditText et_key;
private EditText et_value;
private EditText et_query;
private SharedPreferences sharedPreferences;
private TextView tv_query;
private EditText et_delete;
private Editor editor; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); sharedPreferences = getSharedPreferences("info2", MODE_PRIVATE);
editor = sharedPreferences.edit(); et_key = (EditText) findViewById(R.id.et_key);
et_value = (EditText) findViewById(R.id.et_value);
et_query = (EditText) findViewById(R.id.et_query);
tv_query = (TextView) findViewById(R.id.tv_content);
et_delete = (EditText) findViewById(R.id.et_delete);
} public void insert(View v) {
//获取键值数据
String key = et_key.getText().toString().trim();
String value = et_value.getText().toString().trim(); //使用editor保存数据
editor.putString(key, value); //注意一定要提交数据,此步骤容易忘记
editor.commit(); }
public void query(View v) { //获得查询的键
String query_text = et_query.getText().toString().trim(); //使用SharedPreferences查询数据
String result = sharedPreferences.getString(query_text, null); if(result == null) {
tv_query.setText("您查询的数据不存在");
}else {
tv_query.setText(result);
}
} public void delete(View v) { //获得删除的键
String delete = et_delete.getText().toString().trim();
//使用editor删除数据
editor.remove(delete);
//一定要提交,该步骤非常容易忽略
editor.commit();
} public void clear(View v) { //使用editor清空数据
editor.clear();
//一定要提交,该步骤非常容易忽略
editor.commit();
} }

②activity_main.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:orientation="vertical"
tools:context=".MainActivity" > <EditText
android:id="@+id/et_key"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="@string/text_key" /> <EditText
android:id="@+id/et_value"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="@string/text_value" /> <Button
android:id="@+id/bt_insert"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="right"
android:onClick="insert"
android:text="@string/text_insert" /> <EditText
android:id="@+id/et_query"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="@string/text_et_value" /> <Button
android:id="@+id/bt_query"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="right"
android:onClick="query"
android:layout_marginLeft="88dp"
android:text="@string/text_bt_query" /> <TextView
android:id="@+id/tv_content"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="@string/text_tv_query"
android:textSize="20sp"
/> <Button
android:id="@+id/bt_delete"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/text_bt_delete"
android:layout_gravity="right"
android:onClick="delete"
/> <EditText
android:id="@+id/et_delete"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="@string/text_et_delete" /> <Button
android:id="@+id/bt_clear"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/text_bt_clear"
android:layout_gravity="right"
android:onClick="clear"
/> </LinearLayout>

Android SharedPreferences存储的更多相关文章

  1. Android SharedPreferences存储详解

    什么是SharedPreferences存储 一种轻量级的数据保存方式 类似于我们常用的ini文件,用来保存应用程序的一些属性设置.较简单的参数设置. 保存现场:保存用户所作的修改或者自定义参数设定, ...

  2. android SharedPreferences 存储对象

    我们知道SharedPreferences只能保存简单类型的数据,例如,String.int等. 如果想用SharedPreferences存取更复杂的数据类型(类.图像等),就需要对这些数据进行编码 ...

  3. Android——SharedPreferences存储(作业)

    作业:制作一个登录界面,以SP方式存储用户名.用户下次登录时自动显示上次填写的用户名 layout文件: <?xml version="1.0" encoding=" ...

  4. Android SharedPreferences存储数据

    SharedPreferences是Android中最容易理解的数据存储技术,实际上SharedPreferences处理的就是一个key-value(键值对)SharedPreferences常用来 ...

  5. Android -- SharedPreferences存储信息

    背景                                                                                             Share ...

  6. Android SharedPreferences存储map的方法

    在网上查了一些资料后,精简改写后得出自己想用的形式,记录一下 public static void putHashMapData(Context context, String key, Map< ...

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

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

  8. Android应用开发SharedPreferences存储数据的使用方法

    Android应用开发SharedPreferences存储数据的使用方法 SharedPreferences是Android中最容易理解的数据存储技术,实际上SharedPreferences处理的 ...

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

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

随机推荐

  1. VBA常用代码解析

    031 删除工作表中的空行 如果需要删除工作表中所有的空行,可以使用下面的代码. Sub DelBlankRow() DimrRow As Long DimLRow As Long Dimi As L ...

  2. Dynamics CRM 之ADFS 使用 SQL Server 的联合服务器场

    此拓扑用于 Active Directory 联合身份验证服务 (AD FS) 不同于使用 Windows 内部数据库 (WID) 部署拓扑,因为不会将数据复制到每台联合服务器场中的联合身份验证服务器 ...

  3. HTML学习(零)简介

    一)HTML介绍 它是一个超文本标记语言,静态页面. 所谓的'超文本'就是指页面内可以包含图片.链接,甚至音乐.程序等非文字元素. 主要的结构为包括"头"部分(英语:Head).和 ...

  4. SDK接入(3)之iOS内支付(In-App Purchase)接入

    SDK接入(3)之iOS内支付(In-App Purchase)接入 继整理了Android平台的SDK接入过程.再来分享下iOS平台的内支付(In-App Purchase)接入,作为笔者在游戏开发 ...

  5. Android InputType详解

    android:inputType 如果设置android:inputType = "number",则默认弹出的输入键盘为数字键盘,且输入的内容只能为数字. InputType文 ...

  6. IOS 网络浅析-(十一 三方 AFNetworking3.0简介)

    AFNetworking3.0是目前最新的版本,本来打算介绍一下2.6,但是想想2.6名不久矣,就决定不介绍了,有兴趣的小伙伴可以上网查一查.下面我就开始进入正题了. 目前使用人数最多的第三方网络库, ...

  7. 从爬取湖北某高校hub教务系统课表浅谈Java信息抓取的实现 —— import java.*;

    原创文章与源码,如果转载请注明来源. 开发环境:Myeclipse,依赖包:apache-httpclient . Jsoup.base64 一.概述 整个系统用Java开发.我们现在要做的是类似于超 ...

  8. 如何在mac上用终端打开XAMPP自带的MySQL

    注:1.本文未经博主同意,不得转载! 2.所有终端语句都分行显示,以免大家看错: 直接开始,过程中对每一步可能出现的错误都进行了说明. 1.安装好xampp,然后打开终端,输入: mysql -u r ...

  9. Mysql查询语句使用select.. for update导致的数据库死锁分析

    近期有一个业务需求,多台机器需要同时从Mysql一个表里查询数据并做后续业务逻辑,为了防止多台机器同时拿到一样的数据,每台机器需要在获取时锁住获取数据的数据段,保证多台机器不拿到相同的数据. 我们My ...

  10. swfupload 相关配置

    部署在IIS上出现404: 修改 C:\Windows\System32\inetsrv\config\applicationHost.config 文件 连续查找requestFiltering,往 ...