Android中我们的应用程序中有少量的数据要保存,而且这些数据的格式很简单,是一些普通的字符串、基本的数据类型,比如:应用程序的各种配置信息(如:是否打开同步,是否打开音响,是否使用振动等),游戏的玩家积分等,我们可以用Android提供的SharedPreferences进行保存。当应用程序有大量数据需要存储、访问,就需要借助于数据库了,Android内置了SQLite数据库,一个轻量级的数据库,它没有后台进程,整个数据库就对应一个文件。
接下来简单介绍一下SharedPreferences和SQLite
数据存储:
一、SharedPreferences
Preference简介:
Preference:轻量级的数据存储方法,应用场合主要是数据比较少的配置信息。 它以“键-值”(是一个Map)对的方式将数据保存在一个XML配置文件中。
使用Preference 方式来存储数据,用到了SharePreferences接口和SharedPreferences的一个内部接口SharedPreferences.Editor,这两个接口在android.content包中。
调用Context.getSharedPreferences(String name,int mode)方法得到SharedPreferences接口。该方法的第一个参数是文件名称,第二个参数是操作模式。操作模式一共有三种:MODE_PRIVATE(私有)、MODE_WORLD_READAVLE(可读)和MODE_WORLD_WRITEABLE(可写)。SharedPreferences提供了获得数据的方法,如getString(String key,String defValue)、getInt(String key,int defValue)等。
调用SharedPreferences的edit()方法返回SharedPreferences.Editor内部接口,该接口中提供了保存数据的方法,如putString(String key,String value)、putInt(String key,int value)等,调用该接口的commit()方法可以将数据进行保存。
1. SharedPreferences
SharedPreferences保存的数据主要是类似于配置信息格式的数据,因此塔保存的数据主要是简单类型的Key-Value对。
SharedPreferences接口主要负责读取应用程序的Preferences数据,它提供了如下方法来访问SharedPreferences中键值对。
a. boolean contains(String key):判断SharedPreferences是否包含特定的数据。
b. abstract Map<String,?> getAll():获取SharedPreferences数据里全部的键值对
c. boolean getXxx(String key,xxx defValue):获取SharedPreferences数据里指定的key对应的value.如果该key不存在,返回默认值defValue。
SharedPreferences接口本身并没有提供写入数据的能力,而是通过SharedPreferences的内部接口,SharedPreferences调用edit()方法即可获取它所对应的Editor对象。
Editor提供了如下方法向SharedPreferences写入数据:
a. SharedPreferences.Editor clear():清空SharedPreferences里面的数据。
b. SharedPreferences.Editor putXxx(String key,xxx value): 向SharedPreferences存入指定的Key对应的数据。
c. SharedPreferences.Editor remove(String key):删除SharedPreferences里指定key对应的数据项。
d. boolean commit():当Editor编辑完成后,调用该方法提交修改。
SharedPreferences本身是一个接口,程序无法直接创建SharedPerences实例,只能通过Context提供的getSharedPreences(String name,int mode)方法来获取SharedPreferences实例,该方法的第二个参数有如下几个值:
a. Context.MODE_PREIVATE:指定该SharedPreferences数据只能被本应用程序读写。
b. Context.MODE_WORLD_READABLE:指定该SharedPreferences数据能被其他应用程序读,但不能写。
c. Context.MODE_WORLD_WRITEABLE:指定该SharedPreferences数据能被其他应用程序读、写。
2. 读写其他程序的SharedPreferences
前提是创建该SharedPreferences的应用程序指定相应的访问权限,例如:指定MODE_WORLD_READABLE:表明该SharedPreferences可被其他的应用程序读取。指定了MODE_WORLD_WRITABLE:表明该SharedPreferences可被其他程序写入。
一个SharedPreferences读取另一个权限为MODE_WORLD_READABLE模式的SharedPreferences时的步骤:
a. 需要创建其他程序对应的Context,例如:useCount = createPackageContext("com.infy.io",Context.CONTEXT_IGNORE_SECURITY);//其中com.infy.io为其他程序的包名(Android系统的包名来 作为该程序的标识的)
b. 调用其他应用程序的Context的getSharedPreferences(String name,int mode)即可获取相应的SharedPreferences对象。
c. 如果需要向其他应用的SharedPreferences数据写入数据,调用SharedPreferences的edit方法获取相应的Editor即可。
如果开发者不通过先获取其他应用程序的Context,再获取SharedPreferences的方式也可读取SharedPreferences数据,也可以完全可以使用IO流的方式读取SharedPreferences对应的XML文件,再通过XML解析来获取数据也是可行的,只是这种方式没有SharedPreferences来读写简单。
3. File存储
Android支持以IO流的方式来访问手机存储器上的文件。
Context提供了两个方法来打开本应用的数据文件夹里的文件IO流。
a. FileInputStream openFileInput(String name):打开应用程序的数据文件夹下的name文件对应的输入流。
b. FileOutputStream openFileOutput(String name,int mode):打开应用程序的数据文件夹下的name文件对应的输出流。
其中第二个方法的二个参数指定打开文件的模式,有如下值:
MODE_PRIVATE:该文件只能被当前程序读写。
MODE_APPEND:以追加的方式打开该问价,应用程序可以向该文件中追加内容。
MODE_WORLD_READABLE:该文件的内容可以被其他程序读取。
MODE_WORLD_WRITEABLE:该文件的内容可以由其他程序读写。
Context还提供了如下几个方法来访问应用程序的数据文件夹:
a. getDir(String name,int mode):在应用程序的数据文件夹下获取或创建name对应的子目录。
b. File getFilesDir():获取该应用程序的数据文件夹得绝对路径。
c. String[] fileList():返回该应用程序的数据文件夹下的全部文件。
d. deleteFile(String):删除该应用程序的数据文件夹下的指定文件。
4. 读写SD卡上的文件:
为了更好的存、取应用程序的大文件,应用程序需要读、写SD卡上的文件。
读、写SD上的文件步骤:
a. 调用Environment的getExternalStorageState()方法判断手机上是否插入了SD卡,并且应用程序具有读写SD卡的权限。
例如:Environment.getExternalStorageSate().equals(Environment.MEDIA_MOUNTED)//如果手机已插入SD卡,且应用程序具有读写SD卡的能力,则返回true.
b. 调用Environment的getExternalStorageDirectory()方法来获取外部存储器、也就是SD卡的目录
c. 使用FileInputStream、FileOutStram、FileReader或FileWriter读、写SD卡里的文件。
(读写SD数据,必须在应用程序的清单文件中添加读写SD卡的权限:<user-permissin android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>//在SD卡中创建于删除文件权限
<user-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>//向SD卡写入数据权限)