欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android应用中使用SharedPreferences类存储数据的方法

程序员文章站 2024-02-29 21:03:46
在android系统中提供了多种存储技术.通过这些存储技术可以将数据存储在各种存储介质上.比如sharedpreferences可以将数据保存着应用软件的私有存储区,这些存...

在android系统中提供了多种存储技术.通过这些存储技术可以将数据存储在各种存储介质上.比如sharedpreferences可以将数据保存着应用软件的私有存储区,这些存储区的数据只能被写入这些数据的软件读取.当然android还支持文件存储、sqlite数据库和content provider。在这里我们将对sharedpreferences存储方式进行介绍。

sharedpreferences是一种轻量级的数据存储方式,学过web开发的同学,可以想象它是一个小小的cookie。它可以用键值对的方式把简单数据类型(boolean、int、float、long和string)存储在应用程序的私有目录下(data/data/包名 /shared_prefs/)自己定义的xml文件中。

sharedpreferences是以键值对来存储应用程序的配置信息的一种方式,它只能存储基本数据类型。一个程序的配置文件仅可以在本应用程序中使用,或者说只能在同一个包内使用,不能在不同的包之间使用。实际上sharedpreferences是采用了xml格式将数据存储到设备中,在ddms中的file explorer中的/data/data//shares_prefs下。

在所有的android sdk存储技术中sharedpreferences技术是最容易理解和使用的,因为sharedpreferences处理的就是一个key–value对。比如保存产品的名称,就可以将key设为producename,value为实际的产品名。

一、获取sharedpreferences对象的方法

(1)通过函数context.getsharedpreferences(string name,int mode),其中name为本组件的配置文件名(如果想要与本应用程序的其他组件共享此配置文件,可以用这个名字来检索到这个配置文件),mode为操作模式,默认的模式为0或mode_private;返回值为sharedpreferences。

(2)通过函数activity.getpreferences(int mode),其中配置文件仅可以被调用的activity使用。mode为操作模式,默认的模式为0或mode_private;返回值为sharedpreferences。

二、使用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透视图来查看数据文件的位置。

四、保存较为复杂的类型的数据

前面介绍的sharedpreferences只能保存简单类型的数据,例如,string,int等。如果需要存取比较复杂的数据类型比如类或者图像,则需要对这些数据进行编码,通常将其转换成base64编码,然后将转换后的数据以字符串的形式保存在xml文件中。

五、设置数据文件的访问权限

因为android系统并不是完全的创新的操作系统,而是在linux内核基础上发展起来的一个移动操作系统,所以android还有一些linux的基本特性。我们用getsharedpreferences方法获得sharedpreferences对象,getsharedpreferences方法的第2个参数值使用到了activity.mode_private常量。除了这个常量以外还可以使用另外3个常量。这4个常量用于指定文件的建立模式。他们一个重要的功能就是设置文件的属性,从而可以设置数据文件的访问权限。

六、可以保存设置的activity:preferenceactivity

由于sharedpreferences可以很容易的保存key-value对,因此,通常使用sharedpreferences保存配置信息。不过android sdk提供了更为容易的方法来设计配置界面,并且可以透明地保存配置信息。这就是preferenceactivity。

preferenceactivity是activity的子类,该类封装了sharedpreferences。因此,preferenceactivity的所有子类都拥有保存key-value对的能力。

preferenceactivity提供了一些常用的设置项,这些设置项可以满足大多数的配置界面的要求。与组件一样,这些配置项既可以从xml文件创建,也可以从代码创建。比较常用的有:

checkboxpreference:对应标签。该设置项会创建一个checkbox组件。
edittextpreference:对应标签。单击该设置项会弹出一个带edittext组件的对话框。
listpreference:对应标签。单击该设置项会弹出带listview组件的对话框。


示例
先上图:

Android应用中使用SharedPreferences类存储数据的方法

然后是main.xml

<?xml version="1.0" encoding="utf-8"?> 
<linearlayout xmlns:android="http://schemas.android.com/apk/res/android" 
  android:orientation="vertical" 
  android:layout_width="fill_parent" 
  android:layout_height="fill_parent" 
  > 
<textview  
  android:layout_width="fill_parent"  
  android:layout_height="wrap_content"  
  android:id="@+id/textview" 
  /> 
</linearlayout> 

activity的代码:

package cn.com.sharedpreferencestest; 
 
import android.app.activity; 
import android.content.sharedpreferences; 
import android.os.bundle; 
import android.util.log; 
import android.widget.textview; 
 
public class sharedpreferencesactivity extends activity { 
  @override 
  public void oncreate(bundle savedinstancestate) { 
    super.oncreate(savedinstancestate); 
    setcontentview(r.layout.main); 
    savesharedpreferences(); 
    readsharedpreferences(); 
     
  } 
   
  /** 
   * @description 创建并保存一些设置信息 
   */ 
  private void savesharedpreferences(){ 
    /* 
     * getsharedpreferences(string name,int mode)方法是在context中定义的抽象方法,在contextwrapper中进行了具体实现, 
     * 该方法会根据用户传递的名称和写入类型创建一个sharedpreferences对象进行返回。 
     * 在activity中,还有一个方法可以回去sharedpreferences对象,这个方法就是sharedpreferences sharedpreferences = getpreferences(mode_private); 
     * 改方法在activity中定义并实现,这里没有name参数是因为该方法默认将当前activity的类名作为name属性(这里的类名并不包含包路径哦) 
     * */ 
    sharedpreferences sharedpreferences = getsharedpreferences("preferences", mode_private); 
     
    //存储数据 
    sharedpreferences.editor editor = sharedpreferences.edit(); 
    editor.putstring("name", "蔡依林"); 
    editor.putint("age", 31); 
    boolean b = editor.commit(); 
     
    if(b){ 
      log.i("通知:", "保存成功!"); 
    }else{ 
      log.i("通知", "保存失败!"); 
    } 
     
  } 
   
  /** 
   * @author chenzheng_java 
   * @description 读取我们添加到sharedpreference对象中的数据 
   * @since 2011/03/05 
   */ 
  private void readsharedpreferences(){ 
    string result = "美女信息:/n" ; 
    sharedpreferences sharedpreferences = this.getsharedpreferences("preferences", mode_private); 
    result+=" 姓名 "+sharedpreferences.getstring("name", "暂时没有人"); 
    result+=" 年龄"+sharedpreferences.getint("age", -1); 
    textview textview = (textview)findviewbyid(r.id.textview); 
    textview.settext(result); 
     
  } 
   
   
} 

其他的都为默认。