第8章数据存储和访问本章学习目标:掌握SharedPreferences的使用方法掌握各种文件存储的区别与适用情况了解SQLite数据库的特点和体系结构掌握SQLite数据库的建立和操作方法理解ContentProvider的用途和原理掌握ContentProvider的创建与使用方法8.1简单存储8.1.1SharedPreferencesSharedPreferences是一种轻量级的数据保存方式通过SharedPreferences可以将NVP(Name/ValuePair,名称/值对)保存在Android的文件系统中,而且SharedPreferences完全屏蔽的对文件系统的操作过程开发人员仅是通过调用SharedPreferences对NVP进行保存和读取8.1简单存储8.1.1SharedPreferencesSharedPreferences不仅能够保存数据,还能够实现不同应用程序间的数据共享SharedPreferences支持三种访问模式私有(MODE_PRIVATE):仅有创建程序有权限对其进行读取或写入全局读(MODE_WORLD_READABLE):不仅创建程序可以对其进行读取或写入,其他应用程序也读取操作的权限,但没有写入操作的权限全局写(MODE_WORLD_WRITEABLE):创建程序和其他程序都可以对其进行写入操作,但没有读取的权限8.1简单存储8.1.1SharedPreferences在使用SharedPreferences前,先定义SharedPreferences的访问模式下面的代码将访问模式定义为私有模式有的时候需要将SharedPreferences的访问模式设定为即可以全局读,也可以全局写,这样就需要将两种模式写成下面的方式publicstaticintMODE=MODE_PRIVATE;publicstaticintMODE=Context.MODE_WORLD_READABLE+Context.MODE_WORLD_WRITEABLE;8.1简单存储8.1.1SharedPreferences定义SharedPreferences的名称,这个名称与在Android文件系统中保存的文件同名。因此,只要具有相同的SharedPreferences名称的NVP内容,都会保存在同一个文件中为了可以使用SharedPreferences,需要将访问模式和SharedPreferences名称作为参数,传递到getSharedPreferences()函数,并获取到SharedPreferences对象publicstaticfinalStringPREFERENCE_NAME=SaveSetting;SharedPreferencessharedPreferences=getSharedPreferences(PREFERENCE_NAME,MODE);8.1简单存储8.1.1SharedPreferences在获取到SharedPreferences对象后,则可以通过SharedPreferences.Editor类对SharedPreferences进行修改,最后调用commit()函数保存修改内容SharedPreferences广泛支持各种基本数据类型,包括整型、布尔型、浮点型和长型等等1.SharedPreferences.Editoreditor=sharedPreferences.edit();2.editor.putString(Name,Tom);3.editor.putInt(Age,20);4.editor.putFloat(Height,);5.editor.commit();8.1简单存储8.1.1SharedPreferences如果需要从已经保存的SharedPreferences中读取数据,同样是调用getSharedPreferences()函数,并在函数的第1个参数中指明需要访问的SharedPreferences名称,最后通过getType()函数获取保存在SharedPreferences中的NVPgetType()函数的第1个参数是NVP的名称第2个参数是在无法获取到数值的时候使用的缺省值1.SharedPreferencessharedPreferences=getSharedPreferences(PREFERENCE_NAME,MODE);2.Stringname=sharedPreferences.getString(Name,DefaultName);3.intage=sharedPreferences.getInt(Age,20);4.floatheight=sharedPreferences.getFloat(Height,);8.1简单存储8.1.2示例通过SimplePreferenceDemo示例介绍具体说明SharedPreferences的文件保存位置和保存格式下图是SimplePreferenceDemo示例的用户界面用户在界面上的输入的信息,将通过SharedPreferences在Activity关闭时进行保存。当应用程序重新开启时,保存在SharedPreferences的信息将被读取出来,并重新呈现在用户界面上8.1简单存储8.1.2示例SimplePreferenceDemo示例运行后,通过FileExplorer查看/data/data下的数据,Android为每个应用程序建立了与包同名的目录,用来保存应用程序产生的数据,这些数据包括文件、SharedPreferences文件和数据库等SharedPreferences文件就保存在/data/data/packagename/shared_prefs目录下8.1简单存储8.1.2示例在本示例中,shared_prefs目录下生成了一个名为SaveSetting.xml的文件这个文件就是保存SharedPreferences的文件,文件大小为170字节,在Linux下的权限为“-rw-rw-rw”8.1简单存储8.1.2示例在Linux系统中,文件权限分别描述了创建者、同组用户和其他用户对文件的操作限制。x表示可执行,r表示可读,w表示可写,d表示目录,-表示普通文件。因此,“-rw-rw-rw”表示SaveSetting.xml可以被创建者、同组用户和其他用户进行读取和写入操作,但不可执行产生这样的文件权限与程序人员设定的SharedPreferences的访问模式有关,“-rw-rw-rw”的权限是“全局读+全局写”的结果如果将SharedPreferences的访问模式设置为私有,则文件权限将成为“-rw-rw---”,表示仅有创建者和同组用户具有读写文件的权限8.1简单存储8.1.2示例SaveSetting.xml文件是以XML格式保存的信息,内容如图如下1.?xmlversion='1.0'encoding='utf-8'standalone='yes'?2.map3.floatname=Heightvalue=1.81/4.stringname=NameTom/string5.intname=Agevalue=20/6./map8.1简单存储8.1.2示例SimplePreferenceDemo示例在onStart()函数中调用loadSharedPreferences()函数,读取保存在SharedPreferences中的姓名、年龄和身高信息,并显示在用户界面上当Activity关闭时,在onStop()函数调用saveSharedPreferences(),保存界面上的信息SimplePreferenceDemo.java的完整代码1.packageedu.hrbeu.SimplePreferenceDemo;2.3.importandroid.app.Activity;4.importandroid.content.Context;5.importandroid.content.SharedPreferences;6.importandroid.os.Bundle;7.importandroid.widget.EditText;8.1简单存储8.1.2示例8.9.publicclassSimplePreferenceDemoextendsActivity{10.11.privateEditTextnameText;12.privateEditTextageText;13.privateEditTextheightText;14.publicstaticfinalStringPREFERENCE_NAME=SaveSetting;15.publicstaticintMODE=Context.MODE_WORLD_READABLE+Context.MODE_WORLD_WRITEABLE;16.17.@Override18.publicvoidonCreate(BundlesavedInstanceState){19.super.onCreate(savedInstanceState);20.setContentView(R.layout.main);21.nameText=(EditText)findViewById(R.id.name);22.ageText=(EditText)findViewById(R.id.age);23.heightText=(EditText)findViewById(R.id.height);24.}8.1简单存储8.1.2示例25.26.@Override27.publicvoidonStart(){28.super.onStart();29.loadSharedPreferences();30.}31.@Override32.publicvoidonStop(){33.super.onStop();34.saveSharedPreferences();35.}36.37.privatevoidloadSharedPreferences(){38.SharedPreferencessharedPreferences=getSharedPreferences(PREFERENCE_NAME,MODE);39.Stringname=sharedPreferences.getString(Name,Tom);40.intage=sharedPreferences.getInt(Age,20);41.floatheight=sharedPreferences.getFloat(Height,);8.1简单存储8.1.2示例42.43.nameText.setText(name);44.ageText.setText(String.valueOf(age));45.heightText.setText(String.valueOf(height));46.}47.48.privatevoidsaveSharedPreferences(){49.SharedPreferencessharedPreferences=getSharedPreferences(PREFERENCE_NAME,MODE);50.SharedPreferences.Editoreditor=sharedPreferences.edit();51.52.editor.putString(Name,nameText.getText().toString());53.editor.putInt(Age,Integer.parseInt(ageText.getText().toString()));54.editor.putFloat(Height,Float.parseFloat(he