SharedPreferences详解

一、简介
SharedPreferences作为Android存储数据方式之一,是一种轻型的数据存储方式,基于XML文件存储key-value键值对数据,通常用来存储一些简单的配置信息。
主要特点是:
1. 只支持Java基本数据类型,不支持自定义数据类型;
2. 应用内数据共享;
3. 使用简单.

二、存储位置
在/data/data/<包名>/shared_prefs目录下。

三、操作数据
SharedPreferences对象本身只能获取数据而不支持存储和修改,存储修改是通过Editor对象实现。
具体操作过程:

1、根据Context获取SharedPreferences对象
2、利用edit()方法获取Editor对象。
3、通过Editor对象存储key-value键值对数据。
4、通过commit()方法提交数据。
四、实例代码

public class SpDemoActivity extends Activity {
    String LOG_TAG = "SpDemoActivity";
    @Override
      public void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         setContentView(R.layout.main);

         //获取SharedPreferences对象
         Context ct = SpDemoActivity.this;       
         SharedPreferences sp = ct.getSharedPreferences("MY_SP", MODE_PRIVATE);
        //存入数据
        Editor editor = sp.edit();
        editor.putString("NAME", "测试姓名");
        editor.putInt("AGE", 20);
        editor.putBoolean("HAS_RIGHT", true);
        editor.commit();

        //返回STRING_KEY的值,定义key值错误或者此key无对应value值的话返回""
        Log.d(LOG_TAG, sp.getString("NAME", ""));
        //如果OTHER_KEY不存在,定义key值错误或者此key无对应value值的返回值为"other"
        Log.d(LOG_TAG, sp.getString("NAME", "other"));
     }

注:在私有目录下生成一个MY_SP.xml文件,里面采用键值对的形式存储数据。

<?xml version='1.0' encoding='utf-8' standalone='yes' ?>
 <map>
 <string name="NAME">测试姓名</string>
 <int name="AGE" value="20" />
 <boolean name="HAS_RIGHT" value="true" />
 </map>

五、方法详解

1、getSharedPreferences(String name, int mode)
参数1:name, 存储时的名称,比如这里的”NAME”;
参数2:mode,打开方式,一般都用Activity.MODE_PRIVATE、MODE_PRIVATE

2、registerOnSharedPreferenceChangeListener(
SharedPreferences.OnSharedPreferenceChangeListener listener)
参数1:listener,注册一个当preference发生改变时被调用的回调函数

3、unregisterOnSharedPreferenceChangeListener(
SharedPreferences.OnSharedPreferenceChangeListener listener):
参数1:listener,删除当前回调函数

4、SharedPreferences.Editor接口
用于修改SharedPreferences对象的内容,所有更改都是在编辑器所做的批处理,而不是复制回原来的SharedPreferences或持久化存储,直到你调用commit(),才会永久存储。
方法说明:
clear():清除内容。
commit():提交修改
remove(String key):删除preference
使用举例:
4.1 存数据
步骤如下:
(1)获取SharedPreferences实例。
(2)通过SharedPreferences的实例获取Editor实例。注:SharedPreferences本身并没有提供写入数据的能力,而是通过其内部类SharedPreferences.Editor来实现。
(3)调用Editor的write方法,切记后面还要commit。
示例代码如下:

SharedPreferences sp = getSharedPreferences("MY_SP", Context.MODE_PRIVATE);
sp.edit().putString("NAME", "小张").putInt("AGE", 11).commit();

或者

SharedPreferences sp = getSharedPreferences("MY_SP", Context.MODE_PRIVATE);
Editor editor = sp.edit();
editor.putString("NAME", "小张");
editor.putInt("AGE", 11);
editor.commit();

切记不要写成下面的形式,会导致数据无法存储

SharedPreferences sp = getSharedPreferences("MY_SP", Context.MODE_PRIVATE);
sp.edit().putString("NAME", "小张");
sp.edit().putInt("AGE", 11);
sp.edit().commit();

为什么这种方式无法存储,因为sp.edit()每次都会返回一个新的Editor对象,Editor的实现类EditorImpl里面会有一个缓存的Map,最后commit的时候先将缓存里面的Map写入内存中的Map,然后将内存中的Map写进XML文件中。使用上面的方式commit,由于sp.edit()又重新返回了一个新的Editor对象,缓存中的Map是空的,导致数据无法被存储。
4.2 取数据
步骤如下:
(1)获取SharedPreferences实例。
(2)读取单一数据:调用SharedPreferences的getXxx()方法,分别读取String,int,long等类型。
(3)读取全量数据:调用SharedPreferences的getAll()方法,再遍历map。
示例代码如下:

SharedPreferences sp = getSharedPreferences("MY_SP", Context.MODE_PRIVATE);
String name = sp.getString("NAME", null);
int age = sp.getInt("AGE", 0);

六、保存与读取图片demo

package demo.sp;  

import java.io.ByteArrayInputStream;  
import java.io.ByteArrayOutputStream;  
import android.os.Bundle;  
import android.util.Base64;  
import android.view.View;  
import android.view.View.OnClickListener;  
import android.widget.Button;  
import android.widget.ImageView;  
import android.app.Activity;  
import android.content.Context;  
import android.content.SharedPreferences;  
import android.content.SharedPreferences.Editor;  
import android.graphics.Bitmap;  
import android.graphics.Bitmap.CompressFormat;  
import android.graphics.BitmapFactory;  

public class MainActivity extends Activity {  
    private Button mSaveButton;  
    private Button mGetButton;  
    private ImageView mImageView;  
    @Override  
    protected void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.main);  
        init();  
    }  

    private void init(){  
        mSaveButton=(Button) findViewById(R.id.saveButton);  
        mSaveButton.setOnClickListener(new OnClickListener() {  
            @Override  
            public void onClick(View view) {  
                saveBitmapToSharedPreferences();  
            }  
        });  
        mGetButton=(Button) findViewById(R.id.getButton);  
        mGetButton.setOnClickListener(new OnClickListener() {  
            @Override  
            public void onClick(View view) {  
                getBitmapFromSharedPreferences();  
            }  
        });  
        mImageView=(ImageView) findViewById(R.id.imageView);  
    }  



    private void saveBitmapToSharedPreferences(){  
        Bitmap bitmap=BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher);  
        //第一步:将Bitmap压缩至字节数组输出流ByteArrayOutputStream  
        ByteArrayOutputStream byteArrayOutputStream=new ByteArrayOutputStream();  
        bitmap.compress(CompressFormat.PNG, 80, byteArrayOutputStream);  
        //第二步:利用Base64将字节数组输出流中的数据转换成字符串String  
        byte[] byteArray=byteArrayOutputStream.toByteArray();  
        String imageString=new String(Base64.encodeToString(byteArray, Base64.DEFAULT));  
        //第三步:将String保持至SharedPreferences  
        SharedPreferences sharedPreferences=getSharedPreferences("testSP", Context.MODE_PRIVATE);  
        Editor editor=sharedPreferences.edit();  
        editor.putString("image", imageString);  
        editor.commit();  
    }  

    private void getBitmapFromSharedPreferences(){  
        SharedPreferences sharedPreferences=getSharedPreferences("testSP", Context.MODE_PRIVATE);  
        //第一步:取出字符串形式的Bitmap  
        String imageString=sharedPreferences.getString("image", "");  
        //第二步:利用Base64将字符串转换为ByteArrayInputStream  
        byte[] byteArray=Base64.decode(imageString, Base64.DEFAULT);  
        ByteArrayInputStream byteArrayInputStream=new ByteArrayInputStream(byteArray);  
        //第三步:利用ByteArrayInputStream生成Bitmap  
        Bitmap bitmap=BitmapFactory.decodeStream(byteArrayInputStream);  
        mImageView.setImageBitmap(bitmap);  
    }    
}

main.xml如下:

<RelativeLayout 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"  
   >  

    <Button  
        android:id="@+id/saveButton"  
        android:layout_width="wrap_content"  
        android:layout_height="wrap_content"  
        android:text="保存图片到SharedPreferences"   
        android:layout_centerHorizontal="true"  
        android:layout_marginTop="25dip"/>  

     <Button  
        android:id="@+id/getButton"  
        android:layout_width="wrap_content"  
        android:layout_height="wrap_content"  
        android:text="从SharedPreferences获取图片"   
        android:layout_centerHorizontal="true"  
        android:layout_marginTop="80dip"/>  

     <ImageView   
        android:id="@+id/imageView"  
        android:layout_width="wrap_content"  
        android:layout_height="wrap_content"  
        android:layout_centerInParent="true"  
        />  

</RelativeLayout> 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值