Android -- 数据存储使用 SharedPreferences 存储数据

Posted Kevin-Dev

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android -- 数据存储使用 SharedPreferences 存储数据相关的知识,希望对你有一定的参考价值。

一、前言

android 中一共提供了五种数据存储方式,分别为:
1. Files:通过FileInputStream和FileOutputStream对文件进行操作。具体使用方法可以参阅博文《Android学习笔记34:使用文件存储数据》。

2. Shared Preferences:常用来存储键值对形式的数据,对系统配置信息进行保存。

3. Content Providers:数据共享,用于应用程序之间数据的访问。

4. SQLite:Android自带的轻量级关系型数据库,支持SQL语言,用来存储大量的数据,并且能够对数据进行使用、更新、维护等操作。

5. Network:通过网络来存储和获取数据。

本篇博文主要介绍第二种方式,通过 Shared Preferences 存储数据。

二、获取 SharedPreferences

要想使用 SharedPreferences 来存储数据,首先需要获取到 SharedPreferences 对象。Android中主要提供了三种方法用于得到 SharedPreferences 对象。

1. Context 类中的 getSharedPreferences()方法:
此方法接收两个参数,第一个参数用于指定 SharedPreferences 文件的名称,如果指定的文件不存在则会创建一个,第二个参数用于指定操作模式,主要有以下几种模式可以选择。MODE_PRIVATE 是默认的操作模式,和直接传入 0 效果是相同的。
MODE_WORLD_READABLE 和 MODE_WORLD_WRITEABLE 这两种模式已在 Android 4.2 版本中被废弃。

  • Context.MODE_PRIVATE: 指定该 SharedPreferences 数据只能被本应用程序读、写;
  • Context.MODE_WORLD_READABLE: 指定该 SharedPreferences 数据能被其他应用程序读,但不能写;
  • Context.MODE_WORLD_WRITEABLE: 指定该 SharedPreferences 数据能被其他应用程序读;
  • Context.MODE_APPEND:该模式会检查文件是否存在,存在就往文件追加内容,否则就创建新文件;

2. Activity 类中的 getPreferences() 方法:
这个方法和 Context 中的 getSharedPreferences()方法很相似,不过它只接收一个操作模式参数,因为使用这个方法时会自动将当前活动的类名作为 SharedPreferences 的文件名。

3. PreferenceManager 类中的 getDefaultSharedPreferences()方法:
这是一个静态方法,它接收一个 Context 参数,并自动使用当前应用程序的包名作为前缀来命名 SharedPreferences 文件。

三、SharedPreferences 的使用

SharedPreferences 对象本身只能获取数据而不支持存储和修改,存储修改是通过 SharedPreferences.edit() 获取的内部接口 Editor 对象实现。使用 Preference 来存取数据,用到了 SharedPreferences 接口和 SharedPreferences 的一个内部接口 SharedPreferences.Editor ,这两个接口在 android.content 包中;

1)写入数据:
     //步骤1:创建一个SharedPreferences对象
     SharedPreferences sharedPreferences= getSharedPreferences("data",Context.MODE_PRIVATE);
     //步骤2: 实例化SharedPreferences.Editor对象
     SharedPreferences.Editor editor = sharedPreferences.edit();
     //步骤3:将获取过来的值放入文件
     editor.putString("name",Tom);
     editor.putInt("age", 28);
     editor.putBoolean("marrid",false);
     //步骤4:提交               
     editor.commit();


 2)读取数据:
     SharedPreferences sharedPreferences= getSharedPreferences("data", Context .MODE_PRIVATE);
     String userId=sharedPreferences.getString("name","");
  
3)删除指定数据
     editor.remove("name");
     editor.commit();


4)清空数据
     editor.clear();
     editor.commit();

注意:如果在 Fragment 中使用 SharedPreferences 时,需要放在 onAttach(Activity activity) 里面进行 SharedPreferences 的初始化,否则会报空指针 即 getActivity()会可能返回null !

读写其他应用的 SharedPreferences 步骤如下:
 1. 在创建 SharedPreferences 时,指定 MODE_WORLD_READABLE 模式,表明该 SharedPreferences 数据可以被其他程序读取;
 2. 创建其他应用程序对应的 Context;
 3. 使用其他程序的 Context 获取对应的 SharedPreferences ;
 4. 如果是写入数据,使用 Editor 接口即可,所有其他操作均和前面一致;

try 
//这里的com.example.mpreferences 就是应用的包名
 Context mcontext = createPackageContext("com.example.mpreferences", CONTEXT_IGNORE_SECURITY);


 SharedPreferences msharedpreferences = mcontext.getSharedPreferences("name_preference", MODE_PRIVATE);
 int count = msharedpreferences.getInt("count", 0);


  catch (PackageManager.NameNotFoundException e) 
       e.printStackTrace();
 

四、工具类 PreferencesUtils.java

public class PreferencesUtils
    public static String PREFERENCE_NAME = "ScarfAndroidCommon";

    private PreferencesUtils() 
        throw new AssertionError();
    

    // put string preferences
    public static boolean putString(Context context, String key, String value) 
        SharedPreferences settings = context.getSharedPreferences(PREFERENCE_NAME, Context.MODE_PRIVATE);
        SharedPreferences.Editor editor = settings.edit();
        editor.putString(key, value);
        return editor.commit();
    

    // get string preferences
    public static String getString(Context context, String key) 
        return getString(context, key, null);
    

    // get string preferences
    public static String getString(Context context, String key, String defaultValue) 
        SharedPreferences settings = context.getSharedPreferences(PREFERENCE_NAME, Context.MODE_PRIVATE);
        return settings.getString(key, defaultValue);
    

    // put int preferences
    public static boolean putInt(Context context, String key, int value) 
        SharedPreferences settings = context.getSharedPreferences(PREFERENCE_NAME, Context.MODE_PRIVATE);
        SharedPreferences.Editor editor = settings.edit();
        editor.putInt(key, value);
        return editor.commit();
    

    // get int preferences
    public static int getInt(Context context, String key) 
        return getInt(context, key, -1);
    

    // get int preferences
    public static int getInt(Context context, String key, int defaultValue) 
        SharedPreferences settings = context.getSharedPreferences(PREFERENCE_NAME, Context.MODE_PRIVATE);
        return settings.getInt(key, defaultValue);
    

    // put long preferences
    public static boolean putLong(Context context, String key, long value) 
        SharedPreferences settings = context.getSharedPreferences(PREFERENCE_NAME, Context.MODE_PRIVATE);
        SharedPreferences.Editor editor = settings.edit();
        editor.putLong(key, value);
        return editor.commit();
    

    // get long preferences
    public static long getLong(Context context, String key) 
        return getLong(context, key, -1);
    

    // get long preferences
    public static long getLong(Context context, String key, long defaultValue) 
        SharedPreferences settings = context.getSharedPreferences(PREFERENCE_NAME, Context.MODE_PRIVATE);
        return settings.getLong(key, defaultValue);
    

    // put float preferences
    public static boolean putFloat(Context context, String key, float value) 
        SharedPreferences settings = context.getSharedPreferences(PREFERENCE_NAME, Context.MODE_PRIVATE);
        SharedPreferences.Editor editor = settings.edit();
        editor.putFloat(key, value);
        return editor.commit();
    

    // get float preferences
    public static float getFloat(Context context, String key) 
        return getFloat(context, key, -1);
    

    // get float preferences
    public static float getFloat(Context context, String key, float defaultValue) 
        SharedPreferences settings = context.getSharedPreferences(PREFERENCE_NAME, Context.MODE_PRIVATE);
        return settings.getFloat(key, defaultValue);
    

    // put boolean preferences
    public static boolean putBoolean(Context context, String key, boolean value) 
        SharedPreferences settings = context.getSharedPreferences(PREFERENCE_NAME, Context.MODE_PRIVATE);
        SharedPreferences.Editor editor = settings.edit();
        editor.putBoolean(key, value);
        return editor.commit();
    

    // get boolean preferences, default is false
    public static boolean getBoolean(Context context, String key) 
        return getBoolean(context, key, false);
    

    // get boolean preferences
    public static boolean getBoolean(Context context, String key, boolean defaultValue) 
        SharedPreferences settings = context.getSharedPreferences(PREFERENCE_NAME, Context.MODE_PRIVATE);
        return settings.getBoolean(key, defaultValue);
    

以上是关于Android -- 数据存储使用 SharedPreferences 存储数据的主要内容,如果未能解决你的问题,请参考以下文章

[USACO 2012 Jan Silver] Bale ShareDP

Android之设置页面(PreferenceActivity使用)

oracle 体系

如何android多Activity间共享数据

Android开发中为啥很少使用JSON存储数据

Android -- 数据存储使用 SharedPreferences 存储数据