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有如下值:
但是实际上,在Android的新版本中已经不再鼓励使用后两种访问方式了,也就是说,不再鼓励通过SharedPrefernences 进行不同应用程序之间的数据交换,而是使用ContentProvider实现,所以我们仅使用MODE_PRIVATE访问方式即可Context.MODE_PRIVATE :指定该SharedPreferences数据只能被本应用读、写。Context.MODE_WORLD_READABLE :指定该SharedPreferences数据也能被其他应用程序读,但不能写。Context.MODE_WORLD_WRITEABLE :指定该SharedPreferences数据也能被其他应用程序读、写。
【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的使用

浙公网安备 33010602011771号