Android 数据存储(一)——SharedPreferences

【SharedPreferences 与 Editor 简介】


对于应用中需要少量的数据进行存储,并且数据的格式很简单(如字符串、标量数值等)的。比如应用各种配置信息、小数据等,Android提供SharedPreferences进行保存。
 
SharedPreferences保存的数据主要是类似配置信息格式的数据,所以它保存的数据主要是简单的“key-value对”。
 
SharedPreferences接口主要负责读取应用程序的Preferences数据。它提供如下方法来访问SharedPreferences中的key-value对:
1. boolean contains(String key) :判断SharedPreferences是否包含特定key的数据。
2. Map<String,?> getAll() :获取SharedPreferences里全部的key-value对。
3. Xxx getXxx(String key, Xxx defValue) :获取指定key对应的value,如果key不存在,则返回默认值defValue。
 
SharedPreferences接口本身未提供写入数据的能力,而是通过其内部接口。其调用SharedPreferences.edit() 方法即可获得它所对应的 SharedPreferences.Editor对象。Editor有如下向SharedPreferences写入数据的方法:
1. Editor.clear() :清空SharedPreferences里所有数据。
2. Editor.putXxx(String key, Xxx Value) :向SharedPreferences里存入指定key对应的数据。
3. Editor.remove(String key) :删除SharedPreferences里指定key对应的数据项。
4. boolean Editor.commit() :当Editor编辑完成后,调用该方法提交修改。
SharedPreferences本身是一个接口,程序无法直接创建实例,只能通过 Context提供的getSharedPreferences(String name, int mode)方法获取实例。其中mode有如下值:
Context.MODE_PRIVATE :指定该SharedPreferences数据只能被本应用读、写。
Context.MODE_WORLD_READABLE :指定该SharedPreferences数据也能被其他应用程序读,但不能写。
Context.MODE_WORLD_WRITEABLE :指定该SharedPreferences数据也能被其他应用程序读、写。
 但是实际上,在Android的新版本中已经不再鼓励使用后两种访问方式了,也就是说,不再鼓励通过SharedPrefernences 进行不同应用程序之间的数据交换,而是使用ContentProvider实现,所以我们仅使用MODE_PRIVATE访问方式即可
 
【SharedPreferences的存储位置和格式】
 
SharedPreferences数据总是保存在: /data /data /<package_name> /shared_prefs 目录下,以XML格式保存,根元素为:<map />。
<map>
<int name="key" value="value" />
<string name="key" > value </string>
</map>
注意:从这里开始我们要建立起这种概念:这个文件对应着SharedPreferences , 而其中的多条记录每一条对应着一个preference对象;所以这样的话,我们可以将这个XML文件称之为 SharedPreferences文件 ; 将其中的每条记录称之为preference记录。
 
 SharedPreferences的使用
SharedPreferences preferences = getSharedPreferces("name", MODE_PRIVATE);
//获得name 指定的SharedPreferences文件对象,如果没有指定文件,那么会在/data /data /<package_name> /shared_prefs目录下生成一个名为name.xml的文件  
SharedPreferences.Editor editor = preferences.edit();
//写入数据
editor.putXxx("name1",value1);
.............................
editor.commit();
//读取数据
Xxx name2 = preferences.getXxx("name1",defValue);
 
 
【实例应用】
 应用一:
布局中有两个按钮,点击一个按钮,则将数据写入指定的SharedPreferences文件中,点击另一个按钮则读出文件中的数据
 1 package com.penglee.sharepreference_test;
 2 
 3 import java.text.SimpleDateFormat;
 4 import java.util.Date;
 5 import android.app.Activity;
 6 import android.content.Context;
 7 import android.content.SharedPreferences;
 8 import android.os.Bundle;
 9 import android.view.Menu;
10 import android.view.MenuItem;
11 import android.view.View;
12 import android.widget.Toast;
13 
14 public class MainActivity extends Activity {
15 
16     SharedPreferences preference ;
17     SharedPreferences.Editor editor;
18     
19     @Override
20     protected void onCreate(Bundle savedInstanceState) {
21         super.onCreate(savedInstanceState);
22         setContentView(R.layout.activity_main);
23         
24         /**现在不鼓励使用另外两种访问模式,在新版本的Android中不再鼓励访问其他应用的SharedPreference文件
25         来完成应用之间的数据交换,而是使用ContentProvider*/
26         preference = getSharedPreferences("setteddata",Context.MODE_PRIVATE);
27         editor = preference.edit();
28     }
29     
30     public void writeData(View view){
31         SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日hh:mm:ss");
32         
33         editor.putString("time", sdf.format(new Date()));
34         editor.putInt("random", (int)(Math.random()*100));
35         editor.commit();
36     }
37     
38     public void readData(View view){
39         String time = preference.getString("time", null);
40         int random = preference.getInt("random", 0) ;
41         String text = (time == null)? "您暂时未写入数据":"写入的数据为:"+random+"\n写入的时间为"+time;
42         Toast.makeText(MainActivity.this, text , Toast.LENGTH_SHORT).show();
43     }
44 }

应用二:使用SharedPreferences文件记录应用被使用的次数

 1 public class MainActivity extends Activity {
 2     
 3     SharedPreferences  preferences ;
 4 
 5     @Override
 6     protected void onCreate(Bundle savedInstanceState) {
 7         super.onCreate(savedInstanceState);
 8         setContentView(R.layout.activity_main);
 9         
10         preferences = getSharedPreferences("count",MODE_PRIVATE);
11         
12         int count = preferences.getInt("count" , 0 );
13         Toast.makeText(MainActivity.this, ""+count, Toast.LENGTH_SHORT).show();
14         
15         SharedPreferences.Editor editor = preferences.edit();
16         editor.putInt("count", ++count);
17         
18         editor.commit();
19     }
20 }

【延伸】

可以看看FragmentPreference的使用

posted @ 2014-12-05 21:32  RoperLee  阅读(1018)  评论(0)    收藏  举报