不同于文件的存储方式,SharedPreferences 是使用键值对的方式来存储数据的。也就是 说当保存一条数据的时候,需要给这条数据提供一个对应的键,这样在读取数据的时候就可 以通过这个键把相应的值取出来。而且 SharedPreferences 还支持多种不同的数据类型存储, 如果存储的数据类型是整型,那么读取出来的数据也是整型的,存储的数据是一个字符串, 读取出来的数据仍然是字符串。

这样你应该就能明显地感觉到,使用 SharedPreferences 来进行数据持久化要比使用文件方便很多,下面我们就来看一下它的具体用法吧。

 

6.3.1    将数据存储到 SharedPreferences 中

要想使用 SharedPreferences 来存储数据,首先需要获取到 SharedPreferences 对象。Android

中主要提供了三种方法用于得到 SharedPreferences 对象。

1.    Context 类中的 getSharedPreferences()方法 此方法接收两个参数,第一个参数用于指定 SharedPreferences 文件的名称,如果指

定的文件不存在则会创建一个,SharedPreferences 文件都是存放在/data/data/<package name>/shared_prefs/目录下的。第二个参数用于指定操作模式,主要有两种模式可以选 择,MODE_PRIVATE 和 MODE_MULTI_PROCESS。MODE_PRIVATE 仍然是默认的操 作模式,和直接传入 0 效果是相同的,表示只有当前的应用程序才可以对这个 SharedPreferences 文件进行读写。MODE_MULTI_PROCESS 则一般是用于会有多个进程中 对同一个 SharedPreferences 文件进行读写的情况。类似地,MODE_WORLD_READABLE 和 MODE_WORLD_WRITEABLE 这两种模式已在 Android 4.2 版本中被废弃。

2.    Activity 类中的 getPreferences()方法

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

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

为前缀来命名 SharedPreferences 文件。

得到了 SharedPreferences 对象之后,就可以开始向 SharedPreferences 文件中存储数据了, 主要可以分为三步实现。

1.    调用 SharedPreferences 对象的 edit()方法来获取一个 SharedPreferences.Editor 对象。

2.    向 SharedPreferences.Editor 对象中添加数据,比如添加一个布尔型数据就使用

putBoolean 方法,添加一个字符串则使用 putString()方法,以此类推。

3.    调用 commit()方法将添加的数据提交,从而完成数据存储操作。 不知不觉中已经将理论知识介绍得挺多了,那我们就赶快通过一个例子来体验一下

SharedPreferences 存储的用法吧。新建一个 SharedPreferencesTest 项目,然后修改 activity_main.xml

中的代码,如下所示:

 

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" >

 

<Button android:id="@+id/save_data" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Save data"

/>

 

</LinearLayout>

这里我们不做任何复杂的功能,只是简单地放置了一个按钮,用于将一些数据存储到

SharedPreferences 文件当中。然后修改 MainActivity 中的代码,如下所示:

 

public class MainActivity extends Activity {

 

private Button saveData;

 

@Override

protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main);

saveData = (Button) findViewById(R.id.save_data);

saveData.setOnClickListener(new OnClickListener() {

@Override

public void onClick(View v) {

SharedPreferences.Editor editor = getSharedPreferences("data", MODE_PRIVATE).edit();

editor.putString("name", "Tom"); editor.putInt("age", 28); editor.putBoolean("married", false);

editor.commit();

}

});

}

 

}

可 以 看 到 , 这 里 首 先 给 按 钮 注 册 了 一 个 点 击 事 件 , 然 后 在 点 击 事 件 中 通 过 getSharedPreferences()方法指定 SharedPreferences 的文件名为 data,并得到了 SharedPreferences.Editor 对象。接着向这个对象中添加了三条不同类型的数据,最后调用 commit()方法进行提交,从 而完成了数据存储的操作。

 

很简单吧?现在就可以运行一下程序了,进入程序的主界面后,点击一下 Save data 按钮。这时的数据应该已经保存成功了,不过为了要证实一下,我们还是要借助 File Explorer 来进行查看。切换到 DDMS 视图,并点击 File Explorer 切换卡,然后进入到/data/data/com. example.sharedpreferencestest/shared_prefs /目录下,可以看到生成了一个 data.xml 文件,如图 6.6 所示。

 

图   6.6

 

接下来同样是点击导出按钮将这个文件导出到电脑上,并用记事本进行查看,里面的内 容如图 6.7 所示。

 

图   6.7

 

可以看到,我们刚刚在按钮的点击事件中添加的所有数据都已经成功保存下来了,并且SharedPreferences 文件是使用 XML 格式来对数据进行管理的。 那么接下来我们自然要看一看,如何从 SharedPreferences 文件中去读取这些数据了。

 

 从 SharedPreferences 中读取数据

你应该已经感觉到了,使用 SharedPreferences 来存储数据是非常简单的,不过下面还有 更好的消息,其实从 SharedPreferences 文件中读取数据更加的简单。SharedPreferences 对象 中提供了一系列的get 方法用于对存储的数据进行读取,每种get 方法都对应了SharedPreferences. Editor 中的一种 put 方法,比如读取一个布尔型数据就使用 getBoolean()方法,读取一个字符 串就使用 getString()方法。这些 get 方法都接收两个参数,第一个参数是键,传入存储数据 时使用的键就可以得到相应的值了,第二个参数是默认值,即表示当传入的键找不到对应的 值时,会以什么样的默认值进行返回。

我们还是通过例子来实际体验一下吧,仍然是在 SharedPreferencesTest 项目的基础上继 续开发,修改 activity_main.xml 中的代码,如下所示:

 

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" >

<Button android:id="@+id/save_data" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Save data"

/>

<Button android:id="@+id/restore_data" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Restore data"

/>

 

</LinearLayout>

这里增加了一个还原数据的按钮,我们希望通过点击这个按钮来从 SharedPreferences 文 件中读取数据。修改 MainActivity 中的代码,如下所示:

 

public class MainActivity extends Activity {

 

private Button saveData;

 

private Button restoreData;

 

 

@Override

protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main);

saveData = (Button) findViewById(R.id.save_data);

restoreData = (Button) findViewById(R.id.restore_data);

……

restoreData.setOnClickListener(new OnClickListener() {

@Override

public void onClick(View v) {

SharedPreferences pref = getSharedPreferences("data",

 

MODE_PRIVATE);

 

 }

 

String name = pref.getString("name", "");

int age = pref.getInt("age", 0);

boolean married = pref.getBoolean("married", false); Log.d("MainActivity", "name is " + name); Log.d("MainActivity", "age is " + age); Log.d("MainActivity", "married is " + married);

 

});

}

 

}

可以看到,我们在还原数据按钮的点击事件中首先通过 getSharedPreferences()方法得到 了 SharedPreferences 对象,然后分别调用它的 getString()、getInt()和 getBoolean()方法去获取 前面所存储的姓名、年龄和是否已婚,如果没有找到相应的值就会使用方法中传入的默认值 来代替,最后通过 Log 将这些值打印出来。

现在重新运行一下程序,并点击界面上的 Restore data 按钮,然后查看 LogCat 中的打印 信息,如图 6.8 所示。

 

图   6.8

 

所有之前存储的数据都成功读取出来了!通过这个例子,我们就把 SharedPreferences 存储的知识也学习完了。相比之下,SharedPreferences 存储确实要比文本存储简单方便了许多, 应用场景也多了不少,比如很多应用程序中的偏好设置功能其实都使用到了 SharedPreferences 技术。