在上一讲中,我们学习了如何将数据存储在SD卡中[数据存储之File文件存储 [即SD卡的写入与读取]],这是一种存储方式,这一讲我们来学习一下使用SharedPreferences存储数据。

1.SharedPreferences 介绍

1) SharedPreferences 是一种参数共享的存储方式,它是通过键值对key-value的形式来储存的。所以读取方式也是通过读取键值对来的。
2) 这种存储方式主要用在存储一些简单的状态信息,比如在实际的软件界面设计中,我们需要保存一些系统的参数,例如屏幕大小和亮度、高度等。在没有数据的情况下我们把这些参数设置到参数共享的文件中以便下次访问。
3) SharedPreferences的基本用法:

1、SharedPreferences preferences =context.getSharedPreferences("login", Context.MODE_PRIVATE);
2、通过SharedPreferences .edit方法获得一个Editor对象。
3、通过SharedPreferences 的Editor.putXXX方法放置键值对保存到文件中。

4、最后调用commit方法保存文件。只有事务结束之后才能提交。

4) 查看 API文档中的SharedPreferences类详细介绍
    这个类 SharedPreferences 提供了一个通用的框架让你存储和检索已经存在的原生数据类型的键值对.你可以使用 SharedPreferences 来保存任何的原生数据:booleans, floats, ints, longs, and strings. (所以这边不建议用共享参数来保存一些复杂的数据类型:比如对象,图片等) 这些数据都会在用户会话期间保留(在应用程序进程关闭掉存储起来)
   在你的应用获取到一个 SharedPreferences 对象,需要使用下面两种方法的一种: 
    (1) getSharedPreferences() 
    (2) getPreferences()

        两种方式的区别:
        调用Context对象的getSharedPreferences()方法获得的SharedPreferences对象可以被同一应用程序下的其他组件共享.
        调用Activity对象的getPreferences()方法获得的SharedPreferences对象只能在该Activity中使用.
    5) 写入数据
1. 调用 edit() 方法来得到一个 SharedPreferences.Editor.
2. 调用 putBoolean() 和 putString()方法来添加数据
3. 调用 commit() 方法来提交新的数据。
    6) 读取数据

使用 SharedPreferences 中的方法如 getBoolean() 和 getString().

2. 程序实现

1) AndroidMainifest.xml 文件,这里面包含了单元测试的内容,如有不懂可以参考前面几讲内容介绍

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <manifest xmlns:android="http://schemas.android.com/apk/res/android"
  3. package="com.android.sharedprefrencesdemo"
  4. android:versionCode="1"
  5. android:versionName="1.0" >
  6. <uses-sdk
  7. android:minSdkVersion="10"
  8. android:targetSdkVersion="17" />
  9. <instrumentation android:name="android.test.InstrumentationTestRunner" android:targetPackage="com.android.sharedprefrencesdemo"></instrumentation>
  10. <application
  11. android:allowBackup="true"
  12. android:icon="@drawable/ic_launcher"
  13. android:label="@string/app_name"
  14. android:theme="@style/AppTheme" >
  15. <uses-library android:name="android.test.runner"/>
  16. <activity
  17. android:name="com.android.sharedprefrencesdemo.MainActivity"
  18. android:label="@string/app_name" >
  19. <intent-filter>
  20. <action android:name="android.intent.action.MAIN" />
  21. <category android:name="android.intent.category.LAUNCHER" />
  22. </intent-filter>
  23. </activity>
  24. </application>
  25. </manifest>

2) 程序的布局文件,只有一个读取的按钮,写入数据在MainActivity的onCreate()方法中写入。

  1. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  2. xmlns:tools="http://schemas.android.com/tools"
  3. android:layout_width="match_parent"
  4. android:layout_height="match_parent"
  5. android:paddingBottom="@dimen/activity_vertical_margin"
  6. android:paddingLeft="@dimen/activity_horizontal_margin"
  7. android:paddingRight="@dimen/activity_horizontal_margin"
  8. android:paddingTop="@dimen/activity_vertical_margin"
  9. tools:context=".MainActivity" >
  10. <Button
  11. android:id="@+id/button1"
  12. android:layout_width="wrap_content"
  13. android:layout_height="wrap_content"
  14. android:layout_alignParentLeft="true"
  15. android:layout_alignParentTop="true"
  16. android:layout_marginLeft="34dp"
  17. android:layout_marginTop="44dp"
  18. android:text="取出" />
  19. </RelativeLayout>

3) MySharedPrefrences.java 类,这个主要是用来实现sharedPreferences存储的方法

  1. package com.android.sharedprefrencesdemo;
  2. import java.util.HashMap;
  3. import java.util.Map;
  4. import android.content.Context;
  5. import android.content.SharedPreferences;
  6. /**
  7. * 实现往共享参数中存储简单的用户名和密码
  8. *
  9. * @author AHuier
  10. */
  11. public class MySharedPrefrences {
  12. private Context context;
  13. public MySharedPrefrences(Context context) {
  14. this.context = context;
  15. }
  16. /**
  17. * 查看 API文档 :getSharedPreferences (String name, int mode)方法 根据参数文件 'name'
  18. * 检索和保存其内容,改方法会返回一个 SharedPreferences 对象,通过它可以检索和修改它的值, 注意任何调用相同 name
  19. * 的都只返回一个SharedPreferences 的实例(单例模式),这就意味这它们会看到批次修改的内容。
  20. * 参数:
  21. * name : 所需的参数文件,如果 这个name 的对应的参数文件不存在,它就会被
  22. *        editor对象所创建(通过SharedPreferences.edit()方法获得), 然后提交修改
  23. *       (通过Editor.commit()方法).
  24. * mode : 工作模式。使用 0 或者 MODE_PRIVATE 作为默认的操作,
  25. *        MODE_WORLD_READABLE 和 MODE_WORLD_WRITEABLE 用来控制读写权限。 在多个进程维护同样的
  26. *        SharedPreferences 文件时会用到 MODE_MULTI_PROCESS。
  27. * 注意 MODE_MULTI_PROCESS 一般是用在Android 2.3版本中或者更低版本,并且在最近的版本中它是被默认关闭的。
  28. * 工作模式有以下四种:
  29. *     MODE_PRIVATE
  30. *     MODE_WORLD_READABLE
  31. *     MODE_WORLD_WRITEABLE
  32. *     MODE_MULTI_PROCESS
  33. * Returns: 返回一个SharedPreferences 的单例用来检索和修改这个共享参数
  34. */
  35. public boolean saveMessage(String name, String pswd) {
  36. boolean flag = false;
  37. SharedPreferences sharedPreferences = context.getSharedPreferences("userInfo",
  38. Context.MODE_PRIVATE);
  39. // 对数据进行编辑,返回的是一个Editor对象
  40. SharedPreferences.Editor editor = sharedPreferences.edit();
  41. editor.putString("name", name);
  42. editor.putString("pswd", pswd);
  43. flag = editor.commit(); //讲数据持久化到存储介质中,有可能是手机内置存储,有可能是SD卡。
  44. return flag;
  45. }
  46. public Map<String, Object> getMessage(){
  47. Map<String, Object> map = new HashMap<String, Object>();
  48. SharedPreferences sharedPreferences = context.getSharedPreferences("userInfo", Context.MODE_PRIVATE);
  49. //从共享参数 SharedPreferences 取出数据
  50. String name = sharedPreferences.getString("name", ""); //如果取不到,默认值为空
  51. String pswd = sharedPreferences.getString("pswd", ""); //如果取不到,默认值为空
  52. //将数据put到HashMap中
  53. map.put("name", name);
  54. map.put("pswd", pswd);
  55. return map;
  56. }
  57. }

4) MainActivity.java 类,程序的主文件

  1. package com.android.sharedprefrencesdemo;
  2. import java.util.Map;
  3. import android.os.Bundle;
  4. import android.app.Activity;
  5. import android.content.Context;
  6. import android.util.Log;
  7. import android.view.Menu;
  8. import android.view.View;
  9. import android.view.View.OnClickListener;
  10. import android.widget.Button;
  11. public class MainActivity extends Activity {
  12. private static final String TAG = "MainActivity";
  13. private Button button;
  14. @Override
  15. protected void onCreate(Bundle savedInstanceState) {
  16. super.onCreate(savedInstanceState);
  17. setContentView(R.layout.activity_main);
  18. initComponent();
  19. save();
  20. button.setOnClickListener(new OnClickListener() {
  21. @Override
  22. public void onClick(View v) {
  23. // TODO Auto-generated method stub
  24. getMsInfo();
  25. }
  26. });
  27. }
  28. @Override
  29. public boolean onCreateOptionsMenu(Menu menu) {
  30. // Inflate the menu; this adds items to the action bar if it is present.
  31. getMenuInflater().inflate(R.menu.main, menu);
  32. return true;
  33. }
  34. private void initComponent() {
  35. button = (Button) findViewById(R.id.button1);
  36. }
  37. public void save() {
  38. // Context context = getContext();
  39. MySharedPrefrences mySharedPrefrences = new MySharedPrefrences(MainActivity.this);
  40. boolean flag = mySharedPrefrences.saveMessage("admin", "1423456");
  41. Log.i(TAG, "----->>--" + flag);
  42. }
  43. public void getMsInfo() {
  44. // Context context = getContext();
  45. MySharedPrefrences mySharedPrefrences = new MySharedPrefrences(MainActivity.this);
  46. Map<String, Object> map = mySharedPrefrences.getMessage();
  47. Log.i(TAG, "---->> " + map.toString());
  48. }
  49. }

5) MyTest.java 单元测试类

  1. package com.android.sharedprefrencesdemo;
  2. import java.util.Map;
  3. import android.content.Context;
  4. import android.test.AndroidTestCase;
  5. import android.util.Log;
  6. public class MyTest extends AndroidTestCase {
  7. private static final String TAG = "MyTest";
  8. public MyTest() {
  9. // TODO Auto-generated constructor stub
  10. }
  11. public void save() {
  12. Context context = getContext();
  13. MySharedPrefrences mySharedPrefrences = new MySharedPrefrences(context);
  14. boolean flag = mySharedPrefrences.saveMessage("admin", "123456");
  15. Log.i(TAG, "----->>--" + flag);
  16. }
  17. public void getMsInfo() {
  18. Context context = getContext();
  19. MySharedPrefrences mySharedPrefrences = new MySharedPrefrences(context);
  20. Map<String, Object> map = mySharedPrefrences.getMessage();
  21. Log.i(TAG, "---->> " + map.toString());
  22. }
  23. }

3. 程序执行结果

1) 编译执行后会生成一个 xml 格式的文件,文件保存位置在 fileExplorer标签页查找 data/data/ 目录下,如下图所示
   注意到这里面文件命名有一个规范,它不需要保存文件的后缀名,它默认是以xml文件来命名的,通常共享参数一般用来保存用户的登陆的状态信息,或者某个功能开关的状态信息。

 
    2) 将其保存在电脑中,然后查看可以发现,它是以一种(map)键值对的形式来存放的,所以我们在取的过程中最好还是以Map的类型去取值。如下图 
       所示

3) 编译执行后输出log,打印出读取的信息,如下所示

转自:http://blog.csdn.net/ahuier/article/details/10365331

数据存储之 SharedPreference 共享参数 (转)的更多相关文章

  1. 1、安卓数据存储机制——sharedPreference

    项目中用到的数据存储方式: 1.这个项目里的“个人标签“.”个性签名“页面的文字存储——sharedPreference:我们项目中用到的Preference来保存用户编辑的标签.签名内容,并支持用户 ...

  2. Android 开发笔记___存储方式__共享参数__sharedprefences

    Android 的数据存储方式有四种,这次是[共享参数__sharedprefences] 听起来挺别扭的,平时看到的app里面,当用户删除了一些软件以后下次安装,发现原来的设置还在,这种情况就是把一 ...

  3. 16_Android的数据存储_ SharedPreference、XML和JSON

    1. Android读写首选项 1.1 SharedPreferences SharedPreferences 是一种轻型的数据存储方式,它的本质是基于XML文件存储Key-Value键值对数据,通常 ...

  4. Android 之数据存储(sdCard,sharedPreference,sqlite数据库)

    sdCard:默认路径在 /storage/sdcard/... Android支持OpenFileOutput和openFileInput方式访问手机存储器上的文件. Context提供了如下两个方 ...

  5. Android数据存储(一)----SharedPreferences详解

    一.Android数据的存储方式: Android系统一共提供了四种数据存储方式.分别是:SharePreference.SQLite.Content Provider和File:此外还有一种网络存储 ...

  6. Android数据存储之共享参数SharedPreferences

    SharedPreferences是Android的一个轻量级存储工具,采用的存储结构是Key-Value的键值对方式,类似于Java的Properties类,二者都是把Key-Value的键值对保存 ...

  7. Kotlin入门(25)共享参数模板

    共享参数SharedPreferences是Android最简单的数据存储方式,常用于存取“Key-Value”键值对数据.在使用共享参数之前,要先调用getSharedPreferences方法声明 ...

  8. android 开发-数据存储之共享参数

    android提供5中数据存储方式 数据存储之共享参数 内部存储 扩展存储 数据库存储 网络存储  而共享存储提供一种可以让用户存储保存一些持久化键值对在文件中,以供其他应用对这些共享参数进行调用.共 ...

  9. Android SharedPreference 数据存储

    参考:http://www.cnblogs.com/friends-wf/p/4835818.html 应用开发过程中,数据存储几乎是肯定会遇到的问题,根据要存储的数据类型和数量,可以选择合适的存储方 ...

随机推荐

  1. sql月,年,统计报表sql报表

    select DevName as 设备名称, count(flux) as 流量数据个数, max(flux) as 流量最大值, min(flux) as 流量最小值, avg(flux) as ...

  2. Train Problem(栈的应用)

    Description As the new term comes, the Ignatius Train Station is very busy nowadays. A lot of studen ...

  3. Android屏幕适配解析 - 详解像素,设备独立像素,归一化密度,精确密度及各种资源对应的尺寸密度分辨率适配问题

    . 作者 :万境绝尘 转载请注明出处 : http://blog.csdn.net/shulianghan/article/details/19698511 . 最近遇到了一系列的屏幕适配问题, 以及 ...

  4. Android开发技巧--Application, ListView排列,格式化浮点数,string.xml占位符,动态引用图片

    一. Application用途 1. Application用途 创建Application时机 : Application在启动的时候会调用Application无参的构造方法创建实例; Appl ...

  5. LintCode-140.快速幂

    快速幂 计算an % b,其中a,b和n都是32位的整数. 样例 例如 231 % 3 = 2 例如 1001000 % 1000 = 0 挑战 O(logn) 标签 分治法 code class S ...

  6. 3ds max启动慢怎么办?

      有时候启动3ds max的时候一直卡在启动界面进不去怎么办?   在百度上搜到了下面这个解决方案,试了下还真有用:   具体就是进到这个文件夹,然后分别进入第一个和第三个文件夹删掉autodesk ...

  7. Ubuntu安装配置JDK、Tomcat、SVN服务器

    一.配置jdk 1.下载JDK http://www.oracle.com/technetwork/java/javase/downloads/index-jsp-138363.html 注:笔者是直 ...

  8. C# 使用this的形参

    示例1: public static RectangleF TransformRect(this Matrix mat, RectangleF rect) 是向Matrix类扩展带有Rectangle ...

  9. div、span绑定内容改变事件

    内容改变事件onchange只适用于form表单标签(input.select.textarea) 当需要对div.span标签进行内容改变监听则无法适用,查阅了一些资料发现jquery有针对的方法, ...

  10. Oracle中预定义角色有哪些?

    1. CONNECT 2. RESOURCE 3. DBA 4. EXP_FULL_DATABASE 5. IMP_FULL_DATABASE 6. DELETE_CATALOG_ROLE 7. EX ...