读写SharedPreferences中的数据

本文介绍了 Android 开发中 SharedPreferences 的使用方法,包括如何保存和读取软件配置参数,并提供了实例代码。此外,还讨论了跨应用访问 SharedPreferences 的权限要求。

 

很多时候我们开发的软件需要向用户提供软件参数设置功能,例如我们常用的 QQ ,用户可以设置是否允许陌生 人添加自己为好友。对于软件配置参数的保存,如果是 window 软件通常我们会采用 ini 文件进行保存,如果是 j2se 应用,我们会采用 properties 属性文件进行保存。如果是 Android 应用,我们最适合采用什么方式保存软件配置参 数呢?
Android 平台给我们提供了一个 SharedPreferences 类,它是一个轻量级的存储类,特别适合用于保存软件 配置参数。使用 SharedPreferences 保存数据,其背后是用 xml 文件存放数据,文件存放在 /data/data/<package name>/shared_prefs 目录下:
SharedPreferences sharedPreferences = getSharedPreferences("zyj", Context.MODE_PRIVATE);
Editor editor = sharedPreferences.edit();// 获取编辑器
editor.putString("name", " 老李 ");
editor.putInt("age", 4);
editor.commit();// 提交修改
生成的 zyj.xml 文件内容如下:
<?xml version='1.0' encoding='utf-8' standalone='yes' ?>
<map>
<string name="name"> 老李 </string>
<int name="age" value="4" />
</map>
因为 SharedPreferences 背后是使用 xml 文件保存数据, getSharedPreferences(name,mode) 方法的第一个参数用于指定该文件的名 称,名称不用带后缀,后缀会由 Android 自动加上。方法的第二个参数指定文件的操作模式,共有四种操作模式,这四种模式前面介 绍使用文件方式保存数据时已经讲解过。如果希望 SharedPreferences 背后使用的 xml 文件能被其他应用读和写,可以指定定 Context.MODE_WORLD_READABLE 和 Context.MODE_WORLD_WRITEABLE 权限。
另外 Activity 还提供了另一个 getPreferences(mode) 方法操作 SharedPreferences , 这个方法默认使用当前类不带包名的类名作为文 件的名称。
SharedPreferences 其实用的是 pull 解释器

访问SharedPreferences中的数据代码如下:
SharedPreferences sharedPreferences = getSharedPreferences("zyj", Context.MODE_PRIVATE);
//getString() 第二个参数为缺省值,如果 preference 中不存在该 key ,将返回缺省值
String name = sharedPreferences.getString("name", "");
int age = sharedPreferences.getInt("age", 1);

如果访问其他应用中的Preference 前提条件是:
preference 创建时指定了 Context.MODE_WORLD_READABLE 或 者 Context.MODE_WORLD_WRITEABLE 权限。如:有个 <package name>com.jbridge.pres.activity 的应用使用下面语句创建了 preference
getSharedPreferences("zyj", Context. MODE_WORLD_READABLE);
其他应用要访问上面应用的 preference , 首先需要创建上面应用的 Context ,然后通过 Context 访问 preference , 访问 preference 时会在应用所在包下的 shared_prefs 目录找到 preference
Context otherAppsContext = createPackageContext("com.jbridge.pres.activity", Context. CONTEXT_IGNORE_SECURITY );
SharedPreferences sharedPreferences = otherAppsContext.getSharedPreferences("zyj", Context.MODE_WORLD_READABLE);
String name = sharedPreferences.getString("name", "");
int age = sharedPreferences.getInt("age", 0);
如果不通过创建 Context 访问其他应用的 preference ,可以以读取 xml 文件方式直接访问其他应用 preference 对应的 xml 文件,如:
File xmlFile = new File(“/data/data/<package name>/shared_prefs/zyj.xml”);//<package name> 应替换成应用的包名

下面,编写一个使用SharedPreferences读写配置文件的小例子。

 

       1.创建Android工程

       Project name:sharedPreferences

       BuildTarget:Android2.2

       Application name:软件参数设置

       Package name:com.com.jbridge.pres.activity

       Create Activity:PreferencesActivity

       Min SDK Version:8

 

       2.编辑strings.xml:

<?xml version="1.0" encoding="utf-8"?>

<resources>

    <string name="hello">Hello World, PreferencesActivity!</string>

    <string name="app_name">软件参数设置</string>

    <string name="tv_name">姓名</string>

    <string name="tv_age">年龄</string>

    <string name="bt_write">设置</string>

    <string name="bt_read">读取</string>

    <string name="save_success">保存成功</string>

    <string name="save_failed">保存失败</string>

</resources>

       3.编辑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"

    >

    <RelativeLayout android:layout_width="fill_parent" 

                    android:layout_height="wrap_content">

        <TextView 

        android:layout_width="wrap_content" 

        android:layout_height="wrap_content" 

        android:text="@string/tv_name" 

        android:id="@+id/tv_name" 

        android:textSize="30px"

        />

        <EditText 

         android:layout_width="fill_parent"

         android:layout_height="wrap_content" 

         android:id="@+id/et_name" 

        android:layout_toRightOf="@id/tv_name" 

        android:layout_alignTop="@id/tv_name" 

        android:layout_marginLeft="30px"

        />

    </RelativeLayout>

    <RelativeLayout android:layout_width="fill_parent" 

                    android:layout_height="wrap_content">

        <TextView 

        android:layout_width="wrap_content" 

        android:layout_height="wrap_content" 

        android:text="@string/tv_age" 

        android:id="@+id/tv_age" 

         android:textSize="30px"

        />

        <EditText 

         android:layout_width="fill_parent"

         android:layout_height="wrap_content" 

         android:id="@+id/et_age" 

        android:layout_toRightOf="@id/tv_age" 

        android:layout_alignTop="@id/tv_age" 

        android:layout_marginLeft="30px"

        />

    </RelativeLayout>

    <RelativeLayout 

    android:layout_width="fill_parent" 

                    android:layout_height="wrap_content"

    >

        <Button

         android:layout_width="wrap_content" 

        android:layout_height="wrap_content" 

         android:id="@+id/bt_write"

         android:text="@string/bt_write"

         

        />

        <Button

         android:layout_width="wrap_content" 

        android:layout_height="wrap_content" 

         android:id="@+id/bt_read"

         android:text="@string/bt_read"

         android:layout_toRightOf="@id/bt_write" 

        android:layout_alignTop="@id/bt_write" 

        android:layout_marginLeft="30px"

        />

    </RelativeLayout>

     <TextView 

        android:layout_width="fill_parent"

        android:layout_height="wrap_content" 

        android:id="@+id/tv_show" 

        />

</LinearLayout>

       4.为按钮添加事件代码

package com.jbridge.pres.activity;

import android.app.Activity;

import android.content.Context;

import android.content.SharedPreferences;

import android.content.SharedPreferences.Editor;

import android.content.res.Resources.NotFoundException;

import android.os.Bundle;

import android.text.Editable;

import android.view.View;

import android.widget.Button;

import android.widget.EditText;

import android.widget.TextView;

import android.widget.Toast;

public class PreferencesActivity extends Activity {

private EditText etName;

     private EditText etAge;

  

private View.OnClickListener onClickListener=new View.OnClickListener() {

 

public void onClick(View view) {

Button button=(Button) view;

SharedPreferences sharedPreferences=PreferencesActivity.this.getSharedPreferences("zyj", Context.MODE_PRIVATE);

switch (button.getId()) {

case R.id.bt_write:

try {

Editor editor=sharedPreferences.edit();

editor.putString("name", etName.getText().toString());

editor.putInt("age",Integer.valueOf(etAge.getText().toString()) );

editor.commit();

Toast.makeText(PreferencesActivity.this, R.string.save_success, Toast.LENGTH_LONG).show();

} catch (NumberFormatException e) {

Toast.makeText(PreferencesActivity.this, R.string.save_failed, Toast.LENGTH_LONG).show();;

e.printStackTrace();

} catch (NotFoundException e) {

Toast.makeText(PreferencesActivity.this, R.string.save_failed, Toast.LENGTH_LONG).show();;

e.printStackTrace();

}

break;

            case R.id.bt_read:

            String name=sharedPreferences.getString("name", "no name");

            String age=String.valueOf(sharedPreferences.getInt("age", 0));

            TextView tvShow=(TextView) PreferencesActivity.this.findViewById(R.id.tv_show);

tvShow.setText("姓名: "+name+"     年龄: "+age);

            break;

default:

break;

}

}

};

    @Override

    public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.main);

       SharedPreferences sharedPreferences=PreferencesActivity.this.getSharedPreferences("zyj", Context.MODE_PRIVATE);

        etName=(EditText) this.findViewById(R.id.et_name);

        etAge=(EditText) this.findViewById(R.id.et_age);

        etName.setText(sharedPreferences.getString("name", "no name"));

        etAge.setText(String.valueOf(sharedPreferences.getInt("age", 0)));

        Button btWrite=(Button) this.findViewById(R.id.bt_write);

        Button btRead=(Button) this.findViewById(R.id.bt_read);

        btWrite.setOnClickListener(onClickListener);     

        btRead.setOnClickListener(onClickListener);     

    }

    /*

          如果访问其他应用中的Preference,前提条件是:该preference创建时指定了Context.MODE_WORLD_READABLE或者Context.MODE_WORLD_WRITEABLE权限。如:有个<package name>为com.jbridge.pres.activity的应用使用下面语句创建了preference。

    getSharedPreferences("zyj", Context.MODE_WORLD_READABLE);

         其他应用要访问上面应用的preference,首先需要创建上面应用的Context,然后通过Context 访问preference ,访问preference时会在应用所在包下的shared_prefs目录找到preference :

    Context otherAppsContext = createPackageContext("com.jbridge.pres.activity", Context.CONTEXT_IGNORE_SECURITY);

    SharedPreferences sharedPreferences = otherAppsContext.getSharedPreferences("zyj", Context.MODE_WORLD_READABLE);

    String name = sharedPreferences.getString("name", "no name");

    int age = sharedPreferences.getInt("age", 0);

    */


}

       5. 运行程序  

       启动模拟器,运行程序。输入名称和年龄,点击保存。我们使用的代码是getSharedPreferences("zyj",Context.MODE_PRIVATE);,当然commit时。它会为我们为”/data/data/com.jbridge.pres.activity/shared_prefszyj.xml”。将 preferences.xml导出,查看它的内容为:

<?xml version='1.0' encoding='utf-8' standalone='yes' ?>
<map>
<string name="name">zyj</string>
<int name="age" value="22" />
</map>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值