首页 > 系统 > Android > 正文

android使用SharedPreferences进行数据存储

2019-12-12 03:39:40
字体:
来源:转载
供稿:网友

很多时候我们开发的软件需要向用户提供软件参数设置功能,例如我们常用的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); }}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持武林网。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表