Android之数据持久化(SharedPreferences 存储)

来源:互联网 发布:unity3d游戏引擎 编辑:程序博客网 时间:2024/05/02 02:30

Android之数据持久化(SharedPreferences 存储)

一,将数据存储到 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" ><Buttonandroid: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;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);saveData = (Button) findViewById(R.id.save_data);saveData.setOnClickListener(new OnClickListener() {@Overridepublic 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()方法进行提交,从
而完成了数据存储的操作。

二,从 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" ><Buttonandroid:id="@+id/save_data"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="Save data"/><Buttonandroid: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;@Overrideprotected 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() {@Overridepublic 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 中的打印
信息,如图所示。






1 0