首页 > 代码库 > Android学习笔记十六.Android数据存储与IO.SharedPreferences

Android学习笔记十六.Android数据存储与IO.SharedPreferences

SharedPreferences
    对于应用程序的数据输入、输出,如果是应用程序只是少量数据需要保存,那么使用普通文件就可以了(SharedPrefereces);但如果应用程序有大量数据需要存储、访问,就需要借助数据库了。Android系统内置了SQLite数据库,SQLite数据库是一个真正轻量级的数据库,它没有后台进程,整个数据库就对应于一个文件。
1.SharedPreferences简介
(1)概念:SharedPreferences保存的数据主要是类似于配置信息格式的数据,因此它保存的数据主要是简单类型的key-value对由于SharedPreferences本身是一个接口,程序无法直接创建SharedPreferences实例,只能通过Context提供的Context.getSharedPreferences(String name,int mode)方法来获取SharedPreferences实例。第二个参数支持如下:
Context.MODE_PRIVATE:指定该SharedPreferences数据只能被本应用程序读、写;
Context.MODE_WORLD_READABLE:指定该SharedPreferences数据能被其他应用程序读,但不能写
Context.MODE_WORLD_WRITEABLE:指定该SharedPreferences数据能被其他应用程序读、写
(2)SharedPreferences数据文件:SharedPreferences数据总是保存在/data/data/<package name>/shared_prefs目录下,且总是以XML格式保存。SharedPreferences数据文件是一个根元素为<map../>的根纹身,该元素里每个子元素代表一个key-value对,当value是整数类型的值时使用<int.../>子元素;当value是字符串类型时,使用<string.../>子元素。
2.API
(1)SharedPreferences接口
    SharedPreferences接口主要负责读取应用程序的Preferences数据,它提供了如下常用方法来访问(读取)SharedPreferences中的key-value对,即根据key读取数据。
boolean contains(String key):判断SharedPreferences是否包含特定key的数据;
abstract Map<String,?>getAll():获取SharedPreferences数据里全部的key-value键值对;
boolean getXxx(String key,xxx defValue):获取SharedPreferences数据里指定key对应的value。如果该key    不存在,返回默认值defValue.
                                                                     其中Xxx可以是boolean、float、int、long、String等各种基本类型的值.
(2)内部接口Editor
    由于SharedPreferences接口本身并没有提供写入数据的能力,而是通过SharedPreferences的内部接口Editor,SharedPreferences调用edit()方法获取它对应的Editor对象来实现数据的写入、删除(清空)。
SharedPreferences.Editor clear():清空SharedPreferences里所有的数据;
SharedPreferences.Editor putXxx(String key,Xxx value):向SharedPreferences存入指定key对应的数据;
SharedPreferences.Editor remove(String key):删除SharedPreferences里指定key对应的数据项;
boolean commit():当Editor编辑完成后,调用该方法提出修改

3.SharedPreferences开发思路
(1)创建一个SharedPreferences实例。用于实现对Preferences数据的访问(读取)及创建Editor对象;
     SharedPreferences preferences= Context.getSharedPreferences(String name,int mode);  
       其中第一个参数name为选项文件名;第二个参数mode为指定该SharedPreferences读取权限
(2)创建一个Editor实例。用于实现对Preferences数据的修改(删除、写入),并提交修改
    SharedPreferences.Editor editor=preferences.edit();
.commit();
(3)最后,通过SharedPreferences实例和Editor实例调用其相应的方法即可实现对Preferences数据的读、写、删除操作

4.Demos实例分析
(1)源码:实现向SharedPreferences中写入、读取数据
package com.example.android_sharedprefences_1;
import java.text.SimpleDateFormat;
import java.util.Date;
import android.app.Activity;
import android.content.Context;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;
public class SharedPreferencesTest extends Activity {
 SharedPreferences preferences;
 SharedPreferences.Editor editor;
 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.main);
 //1.获取只能被本应用程序读、写的SharedPreferences对象
  preferences=getSharedPreferences("jiangdongguo",Context.MODE_PRIVATE);	//实例化一个SharedPreferences对象
  editor=preferences.edit();	 //实例化一个SharedPreferences.Editor对象
 
  Button read=(Button)findViewById(R.id.readBtn);
  Button write=(Button)findViewById(R.id.writeBtn);
 //2.读取SharedPreferences中的数据:读取字符串、int类型数据
  read.setOnClickListener(new OnClickListener(){
   @Override
   public void onClick(View v) {
    String time=preferences.getString("time", null);	//获取键值为time的数据
    int randNum=preferences.getInt("random", 0);	 //获取键值为random的数据
    String result=(time==null?"您暂时还未写入数据":"写入时间为:"+time+"\n上次生成的随机数为:"+randNum);
    Toast.makeText(SharedPreferencesTest.this, result, Toast.LENGTH_SHORT).show();
   }
  });
 //3.利用SharedPreferences.Editor向Preferences写入数据
  write.setOnClickListener(new OnClickListener(){
   @Override
   public void onClick(View v) {
    SimpleDateFormat sdf=new SimpleDateFormat("yyyy年MM月dd日"+"hh:mm:ss");
    editor.putString("time",sdf.format(new Date()));	//存入当前时间到time键
    editor.putInt("random", (int)(Math.random()*100));	//存入一个随机数
    editor.commit();	 //提交所有存入的数据
   }
   
  });
 }
}
注释1:
SimpleDateFormat sdf=new SimpleDateFormat("yyyy年MM月dd日"+"hh:mm:ss");
editor.putString("time",sdf.format(new Date())); //存入当前时间到time键
由于SharedPreferences并不支持写入Date类型的值,故程序使用了SimpleDateFormat将Date格式化成字符串后写入
效果演示
技术分享
技术分享
(2)源码:使用SharedPreferences记录应用程序的使用次数
 实现:当用户第一次启动该应用程序时,系统创建SharedPreferences来记录使用次数
/*实现功能:计算应用程序被打开的次数*/ 
package com.example.android_sharedprefences_2;
import android.support.v7.app.ActionBarActivity; 
import android.widget.Toast;
import android.content.Context;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.os.Bundle;
public class Usecount extends ActionBarActivity {
 SharedPreferences preferences;
 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.main);
 //1.获取本应用程序的SharedPreferences,其文件名为count
  preferences=getSharedPreferences("count",Context.MODE_WORLD_READABLE);
 //2.读取SharedPreferences里的count数据(默认值为0),并显示
  int count=preferences.getInt("count", 0);	    
  Toast.makeText(this, "程序被使用了"+count+"次。",Toast.LENGTH_SHORT).show();
 //3.存储count次数到SharedPreferences里(应用每打开依次,count+1)
  Editor editor=preferences.edit();
  editor.putInt("count", ++count);
 //4.提交数据
  editor.commit();
 }
}
注释1:int count=preferences.getInt("count", 0);  初始count的值为0
效果演示:
技术分享技术分享

(3)源码:实现读、写其他应用SharedPreferences
步骤:a.需要创建其他程序对应的Context,其中第一个参数为其他应用程序的包名
                useCount=createPackageContext("com.example.android_sharedprefences_2",Context.CONTEXT_IGNORE_SECURITY);
            b.创建SharedPreferences实例
            c.创建Editor实例
/*实现:读取其他应用程序所保存的SharedPreferences数据*/
package com.example.android_sharedpreferences_3;
import android.app.Activity;
import android.content.Context;
import android.content.SharedPreferences;
import android.content.pm.PackageManager.NameNotFoundException;
import android.os.Bundle;
import android.widget.TextView;
public class ReadOtherPreferences extends Activity {
 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.main);
  Context useCount=null;
  try{
  //1.获取其他程序所对应的Context
   useCount=createPackageContext("com.example.android_sharedprefences_2",Context.CONTEXT_IGNORE_SECURITY);
  }
  catch(NameNotFoundException e)
  {
   e.printStackTrace();
  }
  //2.使用其他程序的Context获取对应的SharedPreferences
  SharedPreferences prefs=useCount.getSharedPreferences("count", Context.MODE_WORLD_READABLE);
  //3.读取数据并显示
  int count=prefs.getInt("count", 0);
  TextView show=(TextView)findViewById(R.id.show);
  show.setText("UseCount应用程序以前被使用了"+count+"次。");
 }
}
注释:
SharedPreferences prefs=useCount.getSharedPreferences("count", Context.MODE_WORLD_READABLE); 
int count=prefs.getInt("count", 0); 
这两句话的作用是:获取其他程序Context所对应的SharedPreferences实例,并读取其"count"键对象来获取对应的value
效果演示:
技术分享
技术分享
总结:访问其他应用程序的SharedPreferences的关键就是获取其他应用的Context。Context代表了访问该Android应用的全局信息的接口。

Android学习笔记十六.Android数据存储与IO.SharedPreferences