zoukankan      html  css  js  c++  java
  • 九、使用SharedPreferences进行数据存储

    很多时候我们开发的软件需要向用户提供软件参数设置功能,例如我们常用的QQ,用户可以设置是否允许陌生人添加自己为好友。对于软件配置参数的保存,如果是window软件通常我们会采用ini文件进行保存,如果是j2se应用,我们会采用properties属性文件或者xml进行保存。如果是Android应用,我们最适合采用什么方式保存软件配置参数呢?Android平台给我们提供了一个SharedPreferences类,它是一个轻量级的存储类,特别适合用于保存软件配置参数。使用SharedPreferences保存数据,其背后是用xml文件存放数据,文件存放在/data/data/<package name>/shared_prefs目录下

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

    Editor editor = sharedPreferences.edit();//获取编辑器

    editor.putString("name", "林计钦");

    editor.putInt("age", 24);

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

                      

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

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

    <map>

       <string name="name">林计钦</string>

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

    </map>

    因为SharedPreferences背后是使用xml文件保存数据,getSharedPreferences(name,mode)方法的第一个参数用于指定该文件的名称,名称不用带后缀,后缀会由Android自动加上。方法的第二个参数指定文件的操作模式,共有四种操作模式,这四种模式前面介绍使用文件方式保存数据时已经讲解过。如果希望SharedPreferences背后使用的xml文件能被其他应用读和写,可以指定Context.MODE_WORLD_READABLE和Context.MODE_WORLD_WRITEABLE权限。

    另外Activity还提供了另一个getPreferences(mode)方法操作SharedPreferences,这个方法默认使用当前类不带包名的类名作为文件的名称。

                  

                       

    访问SharedPreferences中的数据

    访问SharedPreferences中的数据代码如下:

    SharedPreferences sharedPreferences = getSharedPreferences("ljq", 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.ljq.action的应用使用下面语句创建了preference。

    getSharedPreferences("ljq", Context.MODE_WORLD_READABLE);

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

    Context otherAppsContext = createPackageContext("com.ljq.action", Context.CONTEXT_IGNORE_SECURITY);

    SharedPreferences sharedPreferences = otherAppsContext.getSharedPreferences("ljq", 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/itcast.xml");//<package name>应替换成应用的包名

               

                 

    案例:

    string.xml文件

    <?xml version="1.0" encoding="utf-8"?>
    <resources>
    <string name="hello">Hello World, SpActivity!</string>
    <string name="app_name">软件配置参数</string>
    <string name="name">姓名</string>
    <string name="age">年龄</string>
    <string name="button">保存设置</string>
    <string name="showButton">显示</string>
    </resources>

                      

    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
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width
    ="wrap_content"
    android:layout_height
    ="wrap_content">
    <TextView android:layout_width="wrap_content"
    android:layout_height
    ="wrap_content"
    android:text
    ="@string/name"
    android:textSize
    ="20px"
    android:id
    ="@+id/nameLable" />
    <EditText android:layout_width="80px"
    android:layout_height
    ="wrap_content"
    android:layout_toRightOf
    ="@id/nameLable"
    android:layout_alignTop
    ="@id/nameLable"
    android:layout_marginLeft
    ="10px"
    android:id
    ="@+id/name" />
    </RelativeLayout>
    <RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width
    ="wrap_content"
    android:layout_height
    ="wrap_content">
    <TextView android:layout_width="wrap_content"
    android:layout_height
    ="wrap_content"
    android:textSize
    ="20px"
    android:text
    ="@string/age"
    android:id
    ="@+id/ageLable" />
    <EditText android:layout_width="80px"
    android:layout_height
    ="wrap_content"
    android:layout_toRightOf
    ="@id/ageLable"
    android:layout_alignTop
    ="@id/ageLable"
    android:layout_marginLeft
    ="10px"
    android:id
    ="@+id/age" />
    </RelativeLayout>
    <RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width
    ="wrap_content"
    android:layout_height
    ="wrap_content">
    <Button android:layout_width="wrap_content"
    android:layout_height
    ="wrap_content"
    android:text
    ="@string/button"
    android:id
    ="@+id/button" />
    <Button android:layout_width="wrap_content"
    android:layout_height
    ="wrap_content"
    android:text
    ="@string/showButton"
    android:layout_toRightOf
    ="@id/button"
    android:layout_alignTop
    ="@id/button"
    android:id
    ="@+id/showButton" />
    </RelativeLayout>
    <TextView android:layout_width="fill_parent"
    android:layout_height
    ="wrap_content"
    android:textSize
    ="20px"
    android:id
    ="@+id/showText" />
    </LinearLayout>

                          

    package com.ljq.activity;

    import android.app.Activity;
    import android.content.Context;
    import android.content.SharedPreferences;
    import android.content.SharedPreferences.Editor;
    import android.os.Bundle;
    import android.view.View;
    import android.widget.Button;
    import android.widget.EditText;
    import android.widget.TextView;
    import android.widget.Toast;

    public class SpActivity extends Activity {
    private EditText nameText;
    private EditText ageText;
    private TextView resultText;
    @Override
    public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    nameText
    = (EditText)this.findViewById(R.id.name);
    ageText
    = (EditText)this.findViewById(R.id.age);
    resultText
    = (TextView)this.findViewById(R.id.showText);

    Button button
    = (Button)this.findViewById(R.id.button);
    Button showButton
    = (Button)this.findViewById(R.id.showButton);
    button.setOnClickListener(listener);
    showButton.setOnClickListener(listener);

    // 回显
    SharedPreferences sharedPreferences=getSharedPreferences("ljq123",
    Context.MODE_WORLD_READABLE
    +Context.MODE_WORLD_WRITEABLE);
    String nameValue
    = sharedPreferences.getString("name", "");
    int ageValue = sharedPreferences.getInt("age", 1);
    nameText.setText(nameValue);
    ageText.setText(String.valueOf(ageValue));
    }

    private View.OnClickListener listener = new View.OnClickListener(){
    public void onClick(View v) {
    Button button
    = (Button)v;
    //ljq123文件存放在/data/data/<package name>/shared_prefs目录下
    SharedPreferences sharedPreferences=getSharedPreferences("ljq123",
    Context.MODE_WORLD_READABLE
    +Context.MODE_WORLD_WRITEABLE);
    switch (button.getId()) {
    case R.id.button:
    String name
    = nameText.getText().toString();
    int age = Integer.parseInt(ageText.getText().toString());
    Editor editor
    = sharedPreferences.edit(); //获取编辑器
    editor.putString("name", name);
    editor.putInt(
    "age", age);
    editor.commit();
    //提交修改
    Toast.makeText(SpActivity.this, "保存成功", Toast.LENGTH_LONG).show();
    break;
    case R.id.showButton:
    String nameValue
    = sharedPreferences.getString("name", "");
    int ageValue = sharedPreferences.getInt("age", 1);
    resultText.setText(
    "姓名:" + nameValue + ",年龄:" + ageValue);
    break;
    }
    }
    };
    }

                

    运行结果

                   

                      

    如何访问其他应用中的Preference?

    package com.ljq.sp;

    import java.io.File;
    import java.io.FileInputStream;

    import android.content.Context;
    import android.content.SharedPreferences;
    import android.test.AndroidTestCase;
    import android.util.Log;

    public class AccessSharePreferenceTest extends AndroidTestCase{
    private static final String TAG = "AccessSharePreferenceTest";

    /**
    * 访问SharePreference的方式一,注:权限要足够
    *
    @throws Exception
    */
    public void testAccessPreference() throws Exception{
    String path
    = "/data/data/com.ljq.activity/shared_prefs/ljq123.xml";
    File file
    = new File(path);
    FileInputStream inputStream
    = new FileInputStream(file);
    //获取的是一个xml字符串
    String data = new FileService().read(inputStream);
    Log.i(TAG, data);
    }

    /**
    * 访问SharePreference的方式二,注:权限要足够
    *
    @throws Exception
    */
    public void testAccessPreference2() throws Exception{
    Context context
    = this.getContext().createPackageContext("com.ljq.activity",
    Context.CONTEXT_IGNORE_SECURITY);
    SharedPreferences sharedPreferences
    = context.getSharedPreferences("ljq123",
    Context.MODE_WORLD_READABLE
    +Context.MODE_WORLD_WRITEABLE);
    String name
    = sharedPreferences.getString("name", "");
    int age = sharedPreferences.getInt("age", 1);
    Log.i(TAG, name
    + " : " +age);
    }
    }
  • 相关阅读:
    考试心得 模拟18
    模拟17 题解
    模拟16 题解
    考试心得 模拟17
    模拟15 题解(waiting)
    BZOJ2653 middle 【主席树】【二分】*
    BZOJ3932 CQOI2015 任务查询系统 【主席树】
    与或 【线段树】 *
    BZOJ1014 JSOI2008 火星人prefix 【非旋转Treap】*
    网络流--最大权闭合子图 *
  • 原文地址:https://www.cnblogs.com/linjiqin/p/2059133.html
Copyright © 2011-2022 走看看