SharedPreference数据存储【工具类】

除了SQLite数据库外,SharedPreferences也是一种轻型的数据存储方式,它的本质是基于XML文件存储key-value键值对数据,通常用来存储一些简单的配置信息。其存储位置在/data/data/<包名>/shared_prefs目录下。SharedPreferences对象本身只能获取数据而不支持存储和修改,存储修改是通过Editor对象实现。实现SharedPreferences存储的步骤如下:

  一、根据Context获取SharedPreferences对象

  二、利用edit()方法获取Editor对象。

  三、通过Editor对象存储key-value键值对数据。

四、通过commit()方法提交数据。

1.getSharedPreferences(String name, int mode)

得到名为‘name’的偏好文件。同时你可以更改和返回他的值。任何调用者在调用同样名字的偏好文件时只有一个实例返回,这就意味着这些调用者都可以看到其他调用者做出的更改。

name为本组件的配置文件名( 自己定义,也就是一个文件名),当这个文件不存在时,直接创建,如果已经存在,则直接使用,

mode为操作模式,默认的模式为0或MODE_PRIVATE,还可以使用MODE_WORLD_READABLE和MODE_WORLD_WRITEABLE

mode指定为MODE_PRIVATE,则该配置文件只能被自己的应用程序访问。

mode指定为MODE_WORLD_READABLE,则该配置文件除了自己访问外还可以被其它应该程序读取。

mode指定为MODE_WORLD_WRITEABLE,则该配置文件除了自己访问外还可以被其它应该程序读取和写入

2,PreferenceManager的方法getSharedPreferences()

这个方法是一个普通的方法,必须有PreferenceManager的实例调用才行

3.getDefaultSharedPreferences方法

这个方法是静态的,因此可以直接调用,同时它与我们调用getSharedPreferences()方法得到的返回值是一样的,只是调用的方式不同罢了。

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

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

如果访问其他应用中的Preference,前提条件是:该preference创建时指定了Context.MODE_WORLD_READABLE或者Context.MODE_WORLD_WRITEABLE权限。如:有个为cn.yang.action的应用使用下面语句创建了preference。

getSharedPreferences(“TEST”, Context.MODE_WORLD_READABLE);

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

Context otherAppsContext = createPackageContext(“cn.wsl.action”, Context.CONTEXT_IGNORE_SECURITY);

SharedPreferences sharedPreferences = otherAppsContext.getSharedPreferences(“TEST”, Context.MODE_WORLD_READABLE);

String name = sharedPreferences.getString(“name”, “”);

int age = sharedPreferences.getInt(“sex”, “”);

如果不通过创建Context访问其他应用的preference,也可以以读取xml文件方式直接访问其他应用preference对应的xml文件,如:

File xmlFile = new File(“/data/data//shared_prefs/itcast.xml”);//应替换成应用的包名。

具体实现代码如下:

public class MainActivity extends Activity {

      @Override

     public void onCreate(Bundle savedInstanceState) {

         super.onCreate(savedInstanceState);

         setContentView(R.layout.main);



        //获取SharedPreferences对象

         Context ctx = MainActivity.this;       

         SharedPreferences sp = ctx.getSharedPreferences("SI", MODE_PRIVATE);

        //存入数据

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

        editor.putString("STRING_KEY", "string1");

       editor.putInt("INT_KEY", 0);

       editor.putBoolean("BOOLEAN_KEY", true);

       editor.commit();



        //返回STRING_KEY的值

       Log.d("SP", sp.getString("STRING_KEY", "none"));

        //如果NOT_EXIST不存在,则返回值为"none"

       Log.d("SP", sp.getString("NOT_EXIST", "none"));

    }

}

SP.xml文件的具体内容如下:

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

<map>

<string name="STRING_KEY">string</string>

 <int name="INT_KEY" value="0" />

<boolean name="BOOLEAN_KEY" value="true" />

</map>

在程序代码中,通过getXXX方法,可以方便的获得对应Key的Value值,如果key值错误或者此key无对应value值,SharedPreferences提供了一个赋予默认值的机会,以此保证程序的健壮性。如下图运行结果中因为并无值为”NOT_EXIST”的Key,所以Log打印出的是其默认值:“none”。在访问一个不存在key值这个过程中,并无任何异常抛出。

SharedPreferences对象与SQLite数据库相比,免去了创建数据库,创建表,写SQL语句等诸多操作,相对而言更加方便,简洁。但是SharedPreferences也有其自身缺陷,比如其职能存储boolean,int,float,long和String五种简单的数据类型,比如其无法进行条件查询等。所以不论SharedPreferences的数据存储操作是如何简单,它也只能是存储方式的一种补充,而无法完全替代如SQLite数据库这样的其他数据存储方式。

2.案例说明:

private void saveflag(int flag){

SharedPreferences sp=this.getSharedPreferences("scrolltag", Context.MODE_PRIVATE);

Editor editor=sp.edit();

editor.putInt("flagtag", flag);

editor.commit();

}

private int getflag(){

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

int flag=sharedPreferences.getInt("flagtag", 0);

return flag;

}

//此方法可以在任何程序中添加该段代码,来获取cn.com.shine.hotel应用中的数据了,前提是在该应用生成xml文件的时候的权限应该是 Context.MODE_WORLD_READABLE,或者是:读写

private String getScrollTextOther(){

String str=null;

Context otherAppsContext = null;

try {

otherAppsContext = createPackageContext("cn.com.shine.hotel",Context.CONTEXT_IGNORE_SECURITY);

SharedPreferences sp =otherAppsContext.getSharedPreferences("scrolltext",Context.MODE_WORLD_READABLE);

str=sp.getString("scrolltext", "");

} catch (NameNotFoundException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

return str;

}


SharedPreference工具类
我们平常开发,经常需要用到SharedPreference数据库,为了开发效率,更方便保存与获取数据,写了这个工具类:

package com.example.shortcut;  
import android.content.Context;  
import android.content.SharedPreferences;  

/** 
 * SharedPreferences的一个工具类,调用setParam就能保存String, Integer, Boolean, Float, Long类型的参数 
 * 同样调用getParam就能获取到保存在手机里面的数据 
 * @author xiaanming 
 * 
 */  
public class SharedPreferencesUtils {  
    /** 
     * 保存在手机里面的文件名 
     */  
    private static final String FILE_NAME = "share_date";  


    /** 
     * 保存数据的方法,我们需要拿到保存数据的具体类型,然后根据类型调用不同的保存方法 
     * @param context 
     * @param key 
     * @param object  
     */  
    public static void setParam(Context context , String key, Object object){  

        String type = object.getClass().getSimpleName();  
        SharedPreferences sp = context.getSharedPreferences(FILE_NAME, Context.MODE_PRIVATE);  
        SharedPreferences.Editor editor = sp.edit();  

        if("String".equals(type)){  
            editor.putString(key, (String)object);  
        }  
        else if("Integer".equals(type)){  
            editor.putInt(key, (Integer)object);  
        }  
        else if("Boolean".equals(type)){  
            editor.putBoolean(key, (Boolean)object);  
        }  
        else if("Float".equals(type)){  
            editor.putFloat(key, (Float)object);  
        }  
        else if("Long".equals(type)){  
            editor.putLong(key, (Long)object);  
        }  

        editor.commit();  
    }  


    /** 
     * 得到保存数据的方法,我们根据默认值得到保存的数据的具体类型,然后调用相对于的方法获取值 
     * @param context 
     * @param key 
     * @param defaultObject 
     * @return 
     */  
    public static Object getParam(Context context , String key, Object defaultObject){  
        String type = defaultObject.getClass().getSimpleName();  
        SharedPreferences sp = context.getSharedPreferences(FILE_NAME, Context.MODE_PRIVATE);  

        if("String".equals(type)){  
            return sp.getString(key, (String)defaultObject);  
        }  
        else if("Integer".equals(type)){  
            return sp.getInt(key, (Integer)defaultObject);  
        }  
        else if("Boolean".equals(type)){  
            return sp.getBoolean(key, (Boolean)defaultObject);  
        }  
        else if("Float".equals(type)){  
            return sp.getFloat(key, (Float)defaultObject);  
        }  
        else if("Long".equals(type)){  
            return sp.getLong(key, (Long)defaultObject);  
        }  

        return null;  
    }  
}  

使用也很简单,保存数据:

SharedPreferencesUtils.setParam(this, "String", "xiaanming");  
SharedPreferencesUtils.setParam(this, "int", 10);  
SharedPreferencesUtils.setParam(this, "boolean", true);  
SharedPreferencesUtils.setParam(this, "long", 100L);  
SharedPreferencesUtils.setParam(this, "float", 1.1f); 

获取数据:

SharedPreferencesUtils.getParam(TimerActivity.this, "String", "");                                                                                        SharedPreferencesUtils.getParam(TimerActivity.this, "int", 0);  
SharedPreferencesUtils.getParam(TimerActivity.this, "boolean", false);  
SharedPreferencesUtils.getParam(TimerActivity.this, "long", 0L);  
SharedPreferencesUtils.getParam(TimerActivity.this, "float", 0.0f);  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值