android数据存储之SharedPreferences

SharedPreferences的使用包括两方面:

  1)利用SharedPreferences读取保存的配置; 

  2)利用SharedPreferences保存用户的配置。

一:有三种获取系统中保存的持久化数据的方式:

1)  public SharedPreferences getPreferences (int mode)

   通过Activity对象获取,获取的是本Activity私有的Preference,保存在系统中的xml形式的文件的名称为这个Activity的名字,因此一个Activity只能有一个,属于这个Activity。

  getPreference源码:

 

Java代码   收藏代码
  1. public SharedPreferences getPreferences(int mode) {  
  2.      return getSharedPreferences(getLocalClassName(), mode);  
  3.  }  

 其实getPreferences (int mode)内部还是调用了getSharedPreferences(getLocalClassName(), mode)方法

2)因为Activity继承了ContextWrapper,因此也是通过Activity对象获取,但是属于整个应用程序,可以有多个,以第一参数的name为文件名保存在系统中。

Java代码   收藏代码
  1. public abstract SharedPreferences getSharedPreferences (String name, int mode)  
  2.   
  3. eg.sp = getSharedPreferences ("Alarming",0);  
  4.   
  5. SharedPreferences preferences;  
  6.   
  7. preferences = getSharedPreferences("fileName", MODE_PRIVATE);//fimename是数据库里的文件名,eg.(Alarming.ini)  
 

MODE_PRIVATE:the default mode,only be accessed by the calling application. Constant Value: 0

MODE_WORLD_READABLE:allow all other applications to have read access to the created file.Constant Value: 1

MODE_WORLD_WRITEABLE: allow all other applications to have write access to the created file.Constant Value: 2

 

Java代码   收藏代码
  1. //如果modle值为空,则系统默认返回‘你好’。   
  2.   
  3. preferences.getString("modle", "你好");   
  4.   
  5. SharedPreferences.Editor editor = preferences.edit();    
  6.   
  7.         //保存组件中的值    
  8.   
  9.         editor.putString("modle", "value");    
  10.   
  11.         //提交保存的结果    
  12.   
  13.         editor.commit();    

 3)PreferenceManager的静态函数,保存PreferenceActivity中的设置,属于整个应用程序,但是只有一个,Android会根据包名和PreferenceActivity的布局文件来起一个名字保存

Java代码   收藏代码
  1. SharedPreferences mPerferences = PreferenceManager.getDefaultSharedPreferences(this);              
  2.   
  3. int counter = mPerferences.getInt("counter", 0);  
  4.   
  5. SharedPreferences.Editor mEditor = mPerferences.edit();         
  6.   
  7. mEditor.putInt("counter", ++counter);  
  8.   
  9. mEditor.commit();  
 

查看Preferences文件,首先打开命令终端:adb shell一下,然后cd data/data进入该目录,ls一下我们会发现一大堆包文件,入下图所示:

cd com.android.tutor (这里是我程序的包名) /shared_prefs,ls一下会发现.xml文件如下图:

打开.xml文件,格式如下(为什么这样大家自己去理解):

Xml代码   收藏代码
  1. view plaincopy to clipboardprint?  
  2.   
  3. <?xml version='1.0' encoding='utf-8' standalone='yes' ?>    
  4.   
  5. <map>    
  6.   
  7. <int name="counter" value="3" />    
  8.   
  9. </map>   
  10.   
  11. <?xml version='1.0' encoding='utf-8' standalone='yes' ?>  
  12.   
  13. <map>  
  14.   
  15. <int name="counter" value="3" />  
  16.   
  17. </map>  

 二、使用SharedPreferences存取数据

保存key-value对一般要指定一个文件名,然后用类似putString的方法指定key和value。SharedPreferences也采用了同样的方法。使用SharedPreferences保存key-value对的步骤如下:

(1) 使用Activity类的getSharedPreferences方法获得SharedPreferences对象。其中存储key-value的文件名的名称由getSharedPreferences方法的第一个参数指定。

(2) 使用SharedPreferences接口的edit获得SharedPreferences.Editor对象。

(3) 通过SharedPreferences.Editor接口的putXXX方法保存key-value对。其中XXX表示value的不同数据类型。Boolean类型的value则是用putBoolean方法,字符串类型的则为putString方法。

(4) 通过SharedPreferences.Editor接口的commit方法保存key-value对。Commit方法相当于数据库事务中的提交(commit)操作。只有在事件结束后进行提交,才会将数据真正保存在数据库中。保存key-value也是一样。

三:数据的存储位置和格式

SharedPreferences将数据文件写在手机内存私有的目录中。在模拟器中测试程序可以通过ADT的DDMS透视图来查看数据文件的位置。

具体的存入和获取操作:

1)编辑strings.xml:

Xml代码   收藏代码
  1. <?xml version="1.0" encoding="utf-8"?>  
  2.   
  3. <resources>  
  4.   
  5.     <string name="hello">Hello World, AndroidSharedPreferences!</string>  
  6.   
  7.     <string name="app_name">Android 应用程序配置</string>  
  8.   
  9.     <string name="tv_name">姓名</string>  
  10.   
  11.     <string name="tv_age">年龄</string>  
  12.   
  13.     <string name="bt_write">设置</string>  
  14.   
  15.     <string name="bt_read">读取</string>  
  16.   
  17.     <string name="save_success">保存成功</string>  
  18.   
  19.     <string name="save_failed">保存失败</string>  
  20.   
  21. </resources>  

 2)编辑main.xml

Xml代码   收藏代码
  1. <?xml version="1.0" encoding="utf-8"?>  
  2.   
  3. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  4.   
  5.          android:orientation="vertical" android:layout_width="fill_parent"  
  6.   
  7.          android:layout_height="fill_parent">  
  8.   
  9.          <!-- 姓名 -->  
  10.   
  11.          <RelativeLayout android:layout_width="fill_parent"  
  12.   
  13.                    android:layout_height="wrap_content">  
  14.   
  15.                    <TextView android:layout_width="70dip" android:layout_height="wrap_content"  
  16.   
  17.                             android:textSize="25dip" android:id="@+id/tv_name" android:text="@string/tv_name" />  
  18.   
  19.                    <EditText android:layout_width="300dip"  
  20.   
  21.                             android:layout_height="wrap_content" android:layout_toRightOf="@id/tv_name"  
  22.   
  23.                             android:id="@+id/et_name" />  
  24.   
  25.          </RelativeLayout>  
  26.   
  27.          <!-- 年龄 -->  
  28.   
  29.          <RelativeLayout android:layout_width="fill_parent"  
  30.   
  31.                    android:layout_height="wrap_content">  
  32.   
  33.                    <TextView android:layout_width="70dip" android:layout_height="wrap_content"  
  34.   
  35.                             android:textSize="25dip" android:id="@+id/tv_age" android:text="@string/tv_age" />  
  36.   
  37.                    <EditText android:layout_width="300dip"  
  38.   
  39.                             android:layout_height="wrap_content" android:layout_toRightOf="@id/tv_age"  
  40.   
  41.                             android:id="@+id/et_age" />  
  42.   
  43.          </RelativeLayout>  
  44.   
  45.          <!-- 按钮 -->  
  46.   
  47.          <RelativeLayout android:layout_width="fill_parent"  
  48.   
  49.                    android:layout_height="wrap_content" android:gravity="right">  
  50.   
  51.                    <Button android:layout_width="wrap_content"  
  52.   
  53.                             android:layout_height="wrap_content" android:text="@string/bt_write"  
  54.   
  55.                             android:id="@+id/bt_set" />  
  56.   
  57.                    <Button android:layout_width="wrap_content"  
  58.   
  59.                             android:layout_height="wrap_content" android:layout_toRightOf="@id/bt_set"  
  60.   
  61.                             android:text="@string/bt_read" android:id="@+id/et_read" />  
  62.   
  63.          </RelativeLayout>  
  64.   
  65. </LinearLayout>  

 3)为按钮添加事件代码

Java代码   收藏代码
  1. package com.changcheng.sharedpreferences;  
  2.   
  3.    
  4.   
  5. import android.app.Activity;  
  6.   
  7. import android.content.Context;  
  8.   
  9. import android.content.SharedPreferences;  
  10.   
  11. import android.content.SharedPreferences.Editor;  
  12.   
  13. import android.os.Bundle;  
  14.   
  15. import android.view.View;  
  16.   
  17. import android.view.View.OnClickListener;  
  18.   
  19. import android.widget.Button;  
  20.   
  21. import android.widget.EditText;  
  22.   
  23. import android.widget.Toast;  
  24.   
  25.    
  26.   
  27. public class AndroidSharedPreferences extends Activity {  
  28.   
  29.    
  30.   
  31.          private static final String TAG = "AndroidSharedPreferences";  
  32.   
  33.          private EditText etName;  
  34.   
  35.          private EditText etAge;  
  36.   
  37.    
  38.   
  39.          /** Called when the activity is first created. */  
  40.   
  41.          @Override  
  42.   
  43.          public void onCreate(Bundle savedInstanceState) {  
  44.   
  45.                    super.onCreate(savedInstanceState);  
  46.   
  47.                    setContentView(R.layout.main);  
  48.   
  49.                    // 获取按钮  
  50.   
  51.                    Button btSet = (Button) this.findViewById(R.id.bt_set);  
  52.   
  53.                    Button btRead = (Button) this.findViewById(R.id.bt_read);  
  54.   
  55.                    // 获取编辑框  
  56.   
  57.                    etName = (EditText) this.findViewById(R.id.et_name);  
  58.   
  59.                    etAge = (EditText) this.findViewById(R.id.et_age);  
  60.   
  61.                    // 添加事件  
  62.   
  63.                    btSet.setOnClickListener(new OnClickListener() {  
  64.   
  65.                             @Override  
  66.   
  67.                             public void onClick(View v) {  
  68.   
  69.                                      // 获取名称和年龄  
  70.   
  71.                                      String name = etName.getText().toString();  
  72.   
  73.                                      String age = etAge.getText().toString();  
  74.   
  75.                                      // 创建SharedPreferences  
  76.   
  77.                                      SharedPreferences sp = getSharedPreferences("preferences",  
  78.   
  79.                                                         Context.MODE_PRIVATE);  
  80.   
  81.                                      // 添加数据  
  82.   
  83.                                      Editor editor = sp.edit();  
  84.   
  85.                                      editor.putString("name", name);  
  86.   
  87.                                      editor.putInt("age", Integer.parseInt(age));  
  88.   
  89.                                      // 保存数据  
  90.   
  91.                                      if (editor.commit())  
  92.   
  93.                                                Toast.makeText(AndroidSharedPreferences.this,  
  94.   
  95.                                                                  R.string.save_success, 1).show();  
  96.   
  97.                                      else  
  98.   
  99.                                                Toast.makeText(AndroidSharedPreferences.this,  
  100.   
  101.                                                                  R.string.save_failed, 1).show();  
  102.   
  103.                             }  
  104.   
  105.                    });  
  106.   
  107.                    btRead.setOnClickListener(new OnClickListener() {  
  108.   
  109.                             @Override  
  110.   
  111.                             public void onClick(View v) {  
  112.   
  113.                                      // 创建SharedPreferences  
  114.   
  115.                                      SharedPreferences sp = getSharedPreferences("preferences",  
  116.   
  117.                                                         Context.MODE_PRIVATE);  
  118.   
  119.                                      // 获取数据  
  120.   
  121.                                      String name = sp.getString("name", "defName");  
  122.   
  123.                                      String age = sp.getInt("age", 0) + "";  
  124.   
  125.                                      // 显示数据  
  126.   
  127.                                      etName.setText(name);  
  128.   
  129.                                      etAge.setText(age);  
  130.   
  131.                             }  
  132.   
  133.                    });  
  134.   
  135.          }  
  136.   
  137. }  

 4)运行程序

启动模拟器,运行程序。输入名称和年龄,点击保存。我们使用的代码是getSharedPreferences("preferences",Context.MODE_PRIVATE);,当然commit时。它会为我们为”/data/data/com.changcheng.sharedpreferences/shared_prefs/preferences.xml”。将 preferences.xml导出,查看它的内容为:

Xml代码   收藏代码
  1. <?xml version='1.0' encoding='utf-8' standalone='yes' ?>  
  2.   
  3. <map>  
  4.   
  5. <string name="name">长城</string>  
  6.   
  7. <int name="age" value="25" />  
  8.   
  9. </map  

 将名称和年龄编辑框的内容清空,然后点击读取按钮,刚才写出的内容被读取进来。 SharedPreferences的使用就是这么简单。

注:SharedPreferences不仅可以实现应用程序关闭在打开时恢复数据,还可以实现同一个应用程序内部两个Activity之间的数据传递(注意访问权限的设置)。当然不同应用程序间也可以访问他们通过SharedPreferences保存的XML文件,不过这样没有大多的应用价值。

四:其他程序访问本程序的配置

通过SharedPreferences创建的配置文件,不需要指定路径和文件后缀名,读取的时候也是。通常情况下,配置只是提供给本应用程序使用的。在这里我们介绍一个小知识点,即其他程序想使用本应用程序的配置,那应该如何使用SharedPreferences呢?如下:

Java代码   收藏代码
  1. Context otherAppContext = createPackageContext("com.changcheng.sharedpreferences", Context.CONTEXT_IGNORE_SECURITY);  
  2.   
  3. SharedPreferences sharedPreferences = otherAppContext.getSharedPreferences("preferences", Context.MODE_WORLD_READABLE);  

 注意,为了使其他程序可以访问本应用程序的配置。那么在我们使用 getSharedPreferences创建配置的时候必须为它的文件访问模式设置为允许其他程序读取或写入等。

 


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值