Android 数据存储
1. 概述
在Android中一共提供了4种数据存储的方式,但是由于存储的这些数据都是其应用程序的私有数据,所以如果需要在其他应用程序中使用这些数据,就要使用Android提供的Content Providers(数据共享)。
Android提供的4种数据存储方式为:
Shared Preferences:它是一个轻量级的键值(key-value)存储机制,只可以存储基本数据类型,主要是针对系统配置信息的保存。
Files:Android使用的是基于Linux的文件系统,程序开发人员可以建立和访问程序自身的私有文件,也可以访问保存在资源目录中的原始文件和XML文件,还可以在SD卡等外部存储设备中保存文件。
SQLite:Android提供的标准数据库,支持SQL语句,可以用来存储大量的数据。
NetWork:通过网络存储和获得数据,
2. Shared Preference
Shared Preference类似于我们常用的ini文件,常用于存储较简单的参数设置。它不仅能够保存数据,还能够实现不同应用程序间的数据共享。
Shared Preference支持三种访问方式:
私有(MODE_PRIVATE):仅创建程序有权限对其进行读取或写入
全局读(MODE_WORLD_READABLE):创建程序和其他程序都可以对其进行读取操作,但没有写入操作的权限
全局写(MODE_WORLD_WRITEABLE):创建程序和其他程序都可以对其进行写入操作,但没有读取的权限
如果既需要全局读也需要全局写的权限,可将访问方式设置为如下形式:
public static int MODE = Context.MODE_WORLD_READABLE + Context.MODE_WORLD_WRITEABLE;
可以通过getSharedPreferences(“fileName”,”Mode”)获取SharedPreferences对象,在获取到SharedPreferences对象后,则可以通过SharedPreferences.Editor类对SharedPreferences进行修改,最后调用commit()函数保存修改内容。例:
SharedPreferences.Editor editor = sharedPreferences.edit();
editor.putString("Name", "Tom");
editor.putInt("Age", 20);
editor.putFloat("Height", 182);
editor.commit();
如果需要从已经保存的SharedPreferences中读取数据,同样是调用getSharedPreferences()函数,并在函数的第1个参数中指明需要访问的SharedPreferences名称,例:
SharedPreferences sharedPreferences = getSharedPreferences(“FileName”, MODE);
String name = sharedPreferences.getString("Name","Default Name");
int age = sharedPreferences.getInt("Age", 20);
float height = sharedPreferences.getFloat("Height",);
注:第二个参数是在无法获取到数值时使用的缺省值。
SharedPreferences文件就保存在/data/data/<package name>/shared_prefs目录下。(Eclipse下切换到DDMS >File Explorer下)。
getSharedPreferences与 getPreferences与getDefaultSharedPreferences的区别:
getSharedPreferences 是Context类中的方法,可以指定file name 以及 mode。
getPreferences 是Activity类中的方法,只需指定mode
每个应用有一个默认的偏好文件preferences.xml,使用getDefaultSharedPreferences获取
详情点击:http://blog.csdn.net/yangzl2008/article/details/7592817
3. Files
Android使用的是基于Linux的文件系统,程序开发人员可以建立和访问程序自身的私有文件,也可以访问保存在资源目录中的原始文件和XML文件,还可以在SD卡等外部存储设备中保存文件。所以本文的文件存储从三个方面介绍:内部存储、外部存储(SD卡)、资源文件等。
内部存储
Android系统不仅支持标准Java的IO类和方法,还提供了能够简化读写流式文件过程的函数。主要介绍openFileOutput()与openFileInput()函数。Android系统支持的四种文件操作模式:
MODE_PRIVATE :私有模式,缺陷模式,文件仅能够被文件创建程序访问,或具有相同UID的程序访问。
MODE_APPEND :追加模式,如果文件已经存在,则在文件的结尾处添加新数据。
MODE_WORLD_READABLE:全局读模式,允许任何程序读取私有文件。
MODE_WORLD_WRITEABLE:全局写模式,允许任何程序写入私有文件。
openFileOutput()函数为写入数据做准备而打开的应用程序私文件,如果指定的文件不存在,则创建一个新的文件。其语法格式如下:
public FileOutputStream openFileOutput(String name, int mode)
第一个参数是文件名,这个参数不可以包含描述路径的斜杠,第二个参数为操作模式。例:
String FILE_NAME = "fileDemo.txt";
FileOutputStream fos = openFileOutput(FILE_NAME,Context.MODE_PRIVATE) ;
String text = “Some data”;
fos.write(text.getBytes());
fos.flush();
fos.close();
为了提高文件系统的性能,一般调用write()函数时,如果写入的数据量较小,系统会把数据保存在数据缓冲区中,等数据量累积到一定程度时再一次性的写入文件中。因此,在调用close()函数关闭文件前,务必要调用flush()函数,将缓冲区内所有的数据写入文件。
openFileInput()函数为读取数据做准备而打开应用程序私文件。其语法格式如下:
public FileInputStream openFileInput (String name)。例:
String FILE_NAME = "fileDemo.txt";
FileInputStream fis = openFileInput(FILE_NAME);
byte[] readBytes = new byte[fis.available()];
while(fis.read(readBytes) != -1){ }
注:上面的两部分代码在实际使用过程中会遇到错误提示,因为文件操作可能会遇到各种问题而最终导致操作失败,因此代码应该使用try/catch捕获可能产生的异常。
外部存储
这里的外部存储主要指的是SD卡,SD卡适用于保存大尺寸的文件或者是一些无需设置访问权限的文件,可以保存录制的大容量的视频文件和音频文件等;SD卡使用的是FAT(File Allocation Table)的文件系统,不支持访问模式和权限控制,但可以通过Linux文件系统的文件访问权限的控制保证文件的私密性;Android模拟器支持SD卡,但模拟器中没有缺省的SD卡,开发人员须在模拟器中手工添加SD卡的映像文件。
使用<Android SDK>/tools目录下的mksdcard工具创建SD卡映像文件,命令如下:
mksdcard –l SDCARD 256M E:\android\sdcard_file
第1个参数-l(小写L)表示后面的字符串是SD卡的标签,这个新建立的SD卡的标签是SDCARD
第2个参数256M表示SD卡的容量是256兆
最后一个参数表示SD卡映像文件的保存位置,上面的命令将映像保存在E:\android目录下sdcard_file文件中。在CMD中执行该命令后,则可在所指定的目录中找到生产的SD卡映像文件
如果希望Android模拟器启动时能够自动加载指定的SD卡,还需要在模拟器的“运行设置”(Run Configurations)中添加SD卡加载命令
SD卡加载命令中只要指明映像文件位置即可
SD卡加载命令
资源文件
程序开发人员可以将程序开发阶段已经准备好的原始格式文件和XML文件分别存放在/res/raw和/res/xml目录下,供应用程序在运行时进行访问
原始格式文件可以是任何格式的文件,例如视频格式文件、音频格式文件、图像文件和数据文件等等,在应用程序编译和打包时,/res/raw目录下的所有文件都会保留原有格式不变
/res/xml目录下的XML文件,一般用来保存格式化的数据,在应用程序编译和打包时会将XML文件转换为高效的二进制格式,应用程序运行时会以特殊的方式进行访问
读取原始格式文件,首先需要调用getResource()函数获得资源对象,然后通过调用资源对象的openRawResource()函数,以二进制流的形式打开指定的原始格式文件。在读取文件结束后,调用close()函数关闭文件流
Resources resources = this.getResources();
InputStream inputStream = null;
inputStream = resources.openRawResource(R.raw.raw_file);
byte[] reader = new byte[inputStream.available()];
while (inputStream.read(reader) != -1) { }
。。。。。。
读取XML格式文件,首先通过调用资源对象的getXml()函数,获取到XML解析器XmlPullParser,XmlPullParser是Android平台标准的XML解析器,这项技术来自一个开源的XML解析API项目XMLPULL。
例:/res/xml/people.xml
<people>
<person name="李某某" age="21" height="1.81" />
<person name="王某某" age="25" height="1.76" />
<person name="张某某" age="20" height="1.69" />
</people>
读取xml文件核心代码:
XmlPullParser parser = resources.getXml(R.xml.people);
String msg = "";
try {
while (parser.next() != XmlPullParser.END_DOCUMENT) {
String people = parser.getName();
String name = null;
String age = null;
String height = null;
if ((people != null) && people.equals("person")) {
int count = parser.getAttributeCount();
for (int i = 0; i < count; i++) {
String attrName = parser.getAttributeName(i);
String attrValue = parser.getAttributeValue(i);
if ((attrName != null) && attrName.equals("name")) {
name = attrValue;
} else if ((attrName != null) && attrName.equals("age")) {
age = attrValue;
} else if ((attrName != null) && attrName.equals("height")) {
height = attrValue;
}
}
if ((name != null) && (age != null) && (height != null)) {
msg += "姓名:"+name+",年龄:"+age+",身高:"+height+"\n";
}
}
}
} catch (Exception e) {
Log.e("ResourceFileDemo", e.getMessage(), e);
}
。。。。。。。
XmlPullParser的XML事件类型
事件类型 |
说明 |
START_TAG |
读取到标签开始标志 |
TEXT |
读取文本内容 |
END_TAG |
读取到标签结束标志 |
END_DOCUMENT |
文档末尾 |
4. SQLite
5. NetWork
6. Content Providers