Android数据存取之Preferences

本文详细介绍了SharedPreferences存储类的使用方法、效率分析及在Android应用中的具体应用案例,包括数据读取与写入、权限模式设定、共享偏好设置等关键点。通过实例展示了如何在Android中利用SharedPreferences高效管理应用配置参数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

SharedPreferences存储类效率分析

      SharedPreferences是Android平台上一个轻量级的存储类,主要是保存一些常用的配置比如窗口状态,一般在Activity中重载窗口状态onSaveInstanceState保存一般使用SharedPreferences完成,它提供了Android平台常规的Long长整形、Int整形、String字符串型的保存,它是什么样的处理方式呢?

SharedPreferences类似过去Windows系统上的ini配置文件,但是它分为多种权限,可以全局共享访问,android123提示最终是以xml方式来保存,整体效率来看不是特别的高,对于常规的轻量级而言比SQLite要好不少,如果真的存储量不大可以考虑自己定义文件格式。xml 处理时Dalvik会通过自带底层的本地XML Parser解析,比如XMLpull方式,这样对于内存资源占用比较好。

 

Android数据存取之Preferences

这种方式应该是用起来最简单的Android读写外部数据的方法了。他的用法基本上和J2SE(java.util.prefs.Preferences)中的用法一样,以一种简单、 透明的方式来保存一些用户个性化设置的字体、颜色、位置等参数信息。一般的应用程序都会提供“设置”或者“首选项”的这样的界面,那么这些设置最后就可以 通过Preferences来保存,而程序员不需要知道它到底以什么形式保存的,保存在了什么地方。当然,如果你愿意保存其他的东西,也没有什么限制。只是在性能上不知道会有什么问题。

在Android系统中,这些信息以XML文件的形式保存在 /data/data/PACKAGE_NAME/shared_prefs 目录下。

数据读取

 

  1. String PREFS_NAME = "Note.sample.roiding.com";  
  2. SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0);  
  3. boolean silent = settings.getBoolean("silentMode"false);  
  4. String hello = settings.getString("hello""Hi");  

 

这段代码中:
  • SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0);
    通过名称,得到一个SharedPreferences,顾名思义,这个Preferences是共享的,共享的范围据现在同一个Package中,这里面说所的Package和Java里面的那个Package不同,貌似这里面的Package是指在AndroidManifest.xml文件中:

 

  1. <manifest xmlns:android="http://schemas.android.com/apk/res/android"  
  2. package="com.roiding.sample.note"  
  3. android:versionCode="1"  
  4. android:versionName="1.0.0">  

 

这里面的package。根据我目前的实验结果看,是这样的,欢迎指正。后面的那个int是用来声明读写模式,先不管那么多了,暂时就知道设为0(android.content.Context.MODE_PRIVATE)就可以了。

  • boolean silent = settings.getBoolean(”silentMode”, false);
    获得一个boolean值,这里就会看到用Preferences的好处了:可以提供一个缺省值。也就是说如果Preference中不存在这个值的话,那么就用后面的值作为返回指,这样就省去了我们的if什么什么为空的判断。

数据写入

 

  1. String PREFS_NAME = "Note.sample.roiding.com";  
  2. SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0);  
  3. SharedPreferences.Editor editor = settings.edit();  
  4. editor.putBoolean("silentMode"true);  
  5. editor.putString("hello""Hello~");  
  6. editor.commit();  

 

有了上面数据读取的代码,这里面的就容易理解了,只是别忘了最后的commit();

 

 

 

 

 

例子二:

 

 

 

传智播客 android SharedPreferences 共享偏好

  (2009-12-30 00:08:13)
标签: 

it

分类: 传智播客学习心得

SharedPreferences 数据也可以通过这种方式进行存储,底层是个XML文件,但是对于我们编程人员是不可见的

SharedPreferences 轻量级存储类,一般都是软件的配置参数

 

实例化两个参数 第一个  就是底层xml文件的名称

第二个参数  操作模式

SharedPreferences sharedPreferences = getSharedPreferences("itcast", Context.MODE_PRIVATE);

 

Editor editor = sharedPreferences.edit();//获取编辑器 之后就可以在xml文件中塞值

editor.putString("name", "传智播客");

editor.putInt("age", 4);

editor.commit();//提交修改

生成的itcast.xml文件内容如下:

<?xml version='1.0' encoding='utf-8' standalone='yes' ?>

<map>

<string name="name">传智播客</string>

<int name="age" value="4" />

</map>

 

下面的是共享偏好增加和删除的功能代码

package cn.itcast.service;

 

import cn.itcast.domain.Person;

import android.content.Context;

import android.content.SharedPreferences;

import android.content.SharedPreferences.Editor;

 

 

public class SoftInfoService {

 

    Context context ;

 

    public SoftInfoService(Context context) {

       super();

       this.context = context;

    }

 

 

    public void save(Person person){

       //得到共享偏好

       SharedPreferences preferences = context.getSharedPreferences("ITCast", context.MODE_WORLD_READABLE+context.MODE_WORLD_WRITEABLE);

       //得到编辑器  存储的时候需要编辑器,查找的时候就不需要了,直接使用共享偏好就可以得到需要的内容

       Editor editor = preferences.edit();

       String name = person.getName();

       int age = person.getAge();

 

       if(name!=null && !"".equals(name)){

           //参数为 保存的名称 ,保存的内容

           editor.putString("name", name);

           editor.putInt("age", age);

       }

       editor.commit();

    }

 

 

    public Person get(){

       SharedPreferences preferences = context.getSharedPreferences("ITCast", context.MODE_WORLD_READABLE+context.MODE_WORLD_WRITEABLE);

       //名字为name,如果找到了就返回字符串,如果没有找到就返回空字符串“”

       String name = preferences.getString("name", "");

       //意思大概同上,如果没有找到age就返回1

       int age = preferences.getInt("age", 1);

       Person person = new Person(name, age);

       return person;

 

    }

}

 

 

 

 

 

三:》》》》》》》》》》》》》》

 

Java代码
  1. 注: 其它应用调用此参数文件:   
  2.         //创建需要调用的参数保存文件应用的Context   
  3.         //第一参数为保存文件所存在的包名   
  4.         //第二个参数表示 忽略安全级别   
  5.         //注: 这里的 this.getContext()是得到当前应用的上下文,因为本测试环境是继承 AndroidTestCase ,如果在Activity中可以直接使用createPackageContext方法   
  6.          Context context = this.getContext().createPackageContext("cn.android.preference", this.getContext().CONTEXT_IGNORE_SECURITY);   
  7.         //通过创建的context得到preferences对象   
  8.          SharedPreferences preferences = context.getSharedPreferences("user", context.MODE_WORLD_READABLE);   
  9.         //通过对象取得文件里面的值,也可以写入,这里就不再测试了   
  10.          String name = preferences.getString("name", "abc");   
  11.         //将得到的值方在日志中,以便看程序是否正确执行   
  12.          Log.e("TestSharedPreferenceParser",name);   
  13.            
  14.         /** 需要注意的是:此文件在被其它应用读取的时候,其权限必须包含 context.MODE_WORLD_READABLE,否则无法找到   */  
  15.   
  16. -------------------------------------------------------------------------------------------------------------------------------------》   
  17.   
  18. package cn.android.preference;   
  19.   
  20. import android.app.Activity;   
  21. import android.content.SharedPreferences;   
  22. import android.content.SharedPreferences.Editor;   
  23. import android.os.Bundle;   
  24. import android.view.View;   
  25. import android.widget.Button;   
  26. import android.widget.EditText;   
  27. import android.widget.Toast;   
  28.   
  29. /**
  30. * SharedPreferences实现参数化的数据保存与读取
  31. * @author Administrator
  32. *
  33. * 2010-6-30 下午02:35:44
  34. */  
  35. public class PreferenceActivity extends Activity {   
  36.   
  37.     //定义一个文本输入框,用于得到输入的name值   
  38.     private EditText nameText;   
  39.     //定义一个文本输入框,用于得到输入的age值   
  40.     private EditText ageText;   
  41.        
  42.        
  43.     @Override  
  44.     public void onCreate(Bundle savedInstanceState) {   
  45.         super.onCreate(savedInstanceState);   
  46.          setContentView(R.layout.main);   
  47.            
  48.         //通过id得到id为name输入框   
  49.          nameText = (EditText) findViewById(R.id.name);   
  50.         //通过id得到id为age输入框   
  51.          ageText = (EditText) findViewById(R.id.age);   
  52.            
  53.         //通过id得到保存按钮   
  54.          Button saveButton = (Button) findViewById(R.id.save);   
  55.         //通过id得到读取按钮   
  56.          Button readButton = (Button) findViewById(R.id.read);   
  57.            
  58.         //为保存按钮添加事件   
  59.          saveButton.setOnClickListener(new View.OnClickListener() {   
  60.   
  61.             @Override  
  62.             public void onClick(View v) {   
  63.                 //通过Activity自带的getSharedPreferences方法,得到SharedPreferences对象   
  64.                 //第一个参数表示保存后 xml 文件的名称(底层实现是将数据保存到xml文档中)。   
  65.                 //第二个参数表示xml文档的权限为私有,并且重新写的数据会覆盖掉原来的数据   
  66.                  SharedPreferences preferences = getSharedPreferences("user", PreferenceActivity.MODE_WORLD_READABLE);   
  67.                    
  68.                 //通过preferences得到它的编辑器对象edit   
  69.                  Editor edit = preferences.edit();   
  70.                 //通过编辑器将name属性和对应的nameText中输入的值写入到xml文档中   
  71.                  edit.putString("name", nameText.getText().toString());   
  72.                 //通过编辑器将age属性和对应的ageText中输入的值写入到xml文档中   
  73.                  String ageStr = ageText.getText().toString();   
  74.                 if(ageStr != null || "".equals(ageStr.trim()))   
  75.                      edit.putInt("age", new Integer(ageStr));   
  76.                 //添加数据完成后,提交编辑器的添加操作   
  77.                  edit.commit();   
  78.                 //提示用户保存成功   
  79.                  Toast.makeText(PreferenceActivity.this, R.string.save_success, Toast.LENGTH_LONG).show();   
  80.              }   
  81.                
  82.          });   
  83.            
  84.         //为读取按钮添加时间   
  85.          readButton.setOnClickListener(new View.OnClickListener() {   
  86.   
  87.             @Override  
  88.             public void onClick(View v) {   
  89.                 //通过Activity自带的getSharedPreferences方法,得到SharedPreferences对象   
  90.                 //此时的第一个参数表示当前应用中的user.xml文件   
  91.                 //如果只读的话,第二个参数没有什么意义,但方法参数需要,可以随便写   
  92.                  SharedPreferences preferences = getSharedPreferences("user", PreferenceActivity.MODE_PRIVATE);   
  93.                 //得到文件中的name标签值,第二个参数表示如果没有这个标签的话,返回的默认值   
  94.                  String name = preferences.getString("name", "");   
  95.                 //得到文件中的age标签值,第二个参数表示如果没有这个标签的话,返回的默认值   
  96.                  Integer age = preferences.getInt("age", 0);   
  97.                 //将读取的name值显示在文本编辑框nameText中   
  98.                  nameText.setText(name);   
  99.                 //将读取的age值显示在文本编辑框ageText中   
  100.                  ageText.setText(age + "");   
  101.                 //提示用户读取成功   
  102.                  Toast.makeText(PreferenceActivity.this, R.string.read_success, Toast.LENGTH_LONG).show();   
  103.              }   
  104.                
  105.          });   
  106.      }   
  107. }   

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值