Android SharedPreferences使用

来源:互联网 发布:mac版flashplayer 编辑:程序博客网 时间:2024/04/30 02:35

转载请标明出处:
http://blog.csdn.net/zq2114522/article/details/50279639;
本文出自:【梁大盛的博客】

Android编程针对轻量级的像Setting,和一些需要简单存储的数据可以选
择使用SharedPreferences.

SharedPreferences是Android系统提供的种实现轻量级键值对的存储API.实现原理是通过XML文件实现简单的键值对储存.本质上是将XML文件的键值对读取出来保存到哈希表中.更新SharedPreferences以后又会将数据保存到XML文件.主要针对一些数据量不大的存储,毕竟读取XML文件和会写XML文件这写IO操作都是很耗时的.

如果需要存储大量数据还选择使用SharedPreferences那么就适得其反了.大数据就应该选择SQL或者文件操作等等.特别是SharedPreferences每次修改.调用commit()函数以后将哈希表回写到XML文件,即使你只修改一个或者多个其实都是将全部数据重新再回写到XML文件.可以想象如果有大量数据性能上会影响多少呢!

应对轻量数据选择SharedPreferences是一个不错的选择!

贴一个小小的Demo,登录保存帐号密码.

MainActivity.java

package com.example.dsliang.sharedpreferencesdemo;import android.app.Activity;import android.content.Context;import android.content.SharedPreferences;import android.os.Bundle;import android.os.Handler;import android.view.View;import android.widget.Button;import android.widget.CheckBox;import android.widget.EditText;import android.widget.Toast;public class MainActivity extends Activity {    EditText mEditId, mEditPassWord;    CheckBox mChBoxSave;    Button mBtnLogin;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        mEditId = (EditText) findViewById(R.id.editId);        mEditPassWord = (EditText) findViewById(R.id.editPassWord);        mChBoxSave = (CheckBox) findViewById(R.id.chBoxSave);        mBtnLogin = (Button) findViewById(R.id.btnLogin);        mBtnLogin.setOnClickListener(mClickListener);    }    @Override    protected void onResume() {        super.onResume();        SharedPreferences preferences = getPreferences(Context.MODE_PRIVATE);        mEditId.setText(preferences.getString("Id", ""));        mEditPassWord.setText(preferences.getString("PassWord", ""));        mChBoxSave.setChecked(preferences.getBoolean("Save", true));    }    View.OnClickListener mClickListener = new View.OnClickListener() {        @Override        public void onClick(View v) {            Handler handler;            SharedPreferences preferences;            SharedPreferences.Editor editor;            preferences = getPreferences(Context.MODE_PRIVATE);            editor = preferences.edit();            if (mChBoxSave.isChecked()) {                editor.putString("Id", mEditId.getText().toString());                editor.putString("PassWord", mEditPassWord.getText().toString());                editor.commit();            } else {                editor.remove("Id").remove("PassWord").commit();            }            v.setClickable(false);            handler = new Handler();            handler.postDelayed(new Runnable() {                @Override                public void run() {                    Toast.makeText(getApplicationContext(), "登录成功", Toast.LENGTH_SHORT).show();                    finish();                }            }, 2000);        }    };}

activity_main.xml

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:tools="http://schemas.android.com/tools"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:gravity="center"    android:orientation="vertical"    tools:context="com.example.dsliang.sharedpreferencesdemo.MainActivity">    <EditText        android:id="@+id/editId"        android:layout_width="200dp"        android:layout_height="wrap_content"        android:gravity="center"        android:singleLine="true" />    <EditText        android:id="@+id/editPassWord"        android:layout_width="200dp"        android:inputType="textPassword"        android:layout_height="wrap_content"        android:gravity="center"        android:singleLine="true" />    <CheckBox        android:id="@+id/chBoxSave"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_gravity="center_horizontal"        android:text="save" />    <Button        android:id="@+id/btnLogin"        android:text="Login"        android:layout_width="wrap_content"        android:layout_height="wrap_content" /></LinearLayout>

sharedpreferences使用:
1,调用

getPreferences(Context.MODE_PRIVATE);getSharedPreferences("LogContect",Context.MODE_PRIVATE);

两构造函数,第一个默认创建一个XML文件保存数据.第二个使用传递的名字构造XML文件用于保存数据.

Context.MODE_PRIVATE代表模式.一般都是用Context.MODE_PRIVATE代表私有的
(默认在”/data/data/包名/shared_prefs/”目录里面创建XML文件)

2,通过构造函数返回的SharedPreferences类进行操作
通过getString,getInt,getBoolean等等获取保存的数据

例如:

mEditPassWord.setText(preferences.getString("PassWord", "请输入密码"));

通过”PassWord”查找,如果没找到返回”请输入密码”

使用起来很简单.

3,保存数据
SharedPreferences保存数据要使用到Editor类
例如:

SharedPreferences preferences;SharedPreferences.Editor editor;preferences = getPreferences(Context.MODE_PRIVATE);editor = preferences.edit();editor.putString("Id", mEditId.getText().toString());editor.putString("PassWord",mEditPassWord.getText().toString());editor.commit();

获取editor以后通过putString,putBoolean,putInt等插入数据.
记得最后要调用commit()提交.不然是不会生效的.

3,删除数据

可以很简单的通过文件系统删除应用程序生成的XML文件.
但是我喜欢通过editor删除.
editor有一个clear()方法.

getPreferences(Context.MODE_PRIVATE).edit().clear();

这样调用其实是不会将SharedPreferences里面的数据清除.clear()函数只是将editor实例里面的哈希表清空并不是清空SharedPreferences的哈希表.我们怎么处理呢?
正确用法:

getPreferences(Context.MODE_PRIVATE).edit().remove("Id").remove("PassWord").commit();

通过remove()方法,remove方法会插入一个特殊的对象标识要删除对应的项.具体分析源码的时候就一清二楚了!

总结:
在小量数据的情景下,SharedPreferences是一个很好的工具.首先SharedPreferences.但是因为SharedPreferences设计的问题也会导致性能的限制.
SharedPreferences使用

读取数据
getPreferences(Context.MODE_PRIVATE)->
SharedPreferences ->
getString/getInt/getBoolean等

保存数据
getPreferences(Context.MODE_PRIVATE)->
SharedPreferences ->
Editor->
putString/putInt/putBoolean等
commit


参考资料:
[1]:Android 开发范例代码大全(第2版)

0 0
原创粉丝点击