Android 数据存储

1. 概述

Android中一共提供了4种数据存储的方式,但是由于存储的这些数据都是其应用程序的私有数据,所以如果需要在其他应用程序中使用这些数据,就要使用Android提供的Content Providers(数据共享)。

Android提供的4种数据存储方式为:

Shared Preferences:它是一个轻量级的键值(key-value)存储机制,只可以存储基本数据类型,主要是针对系统配置信息的保存。

FilesAndroid使用的是基于Linux的文件系统,程序开发人员可以建立和访问程序自身的私有文件,也可以访问保存在资源目录中的原始文件和XML文件,还可以在SD卡等外部存储设备中保存文件。

SQLiteAndroid提供的标准数据库,支持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

getPreferencesActivity类中的方法,只需指定mode

每个应用有一个默认的偏好文件preferences.xml,使用getDefaultSharedPreferences获取

详情点击:http://blog.csdn.net/yangzl2008/article/details/7592817

3.Files

Android使用的是基于Linux的文件系统,程序开发人员可以建立和访问程序自身的私有文件,也可以访问保存在资源目录中的原始文件和XML文件,还可以在SD卡等外部存储设备中保存文件。所以本文的文件存储从三个方面介绍:内部存储、外部存储(SD卡)、资源文件等。

内部存储

Android系统不仅支持标准JavaIO类和方法,还提供了能够简化读写流式文件过程的函数。主要介绍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卡使用的是FATFile 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解析器XmlPullParserXmlPullParserAndroid平台标准的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);

}

。。。。。。。

XmlPullParserXML事件类型

事件类型

说明

START_TAG

读取到标签开始标志

TEXT

读取文本内容

END_TAG

读取到标签结束标志

END_DOCUMENT

文档末尾

4.SQLite

5.NetWork

6.Content Providers

更多相关文章

  1. mybatisplus的坑 insert标签insert into select无参数问题的解决
  2. 箭头函数的基础使用
  3. python起点网月票榜字体反爬案例
  4. NPM 和webpack 的基础使用
  5. Python技巧匿名函数、回调函数和高阶函数
  6. 【阿里云镜像】使用阿里巴巴DNS镜像源——DNS配置教程
  7. Android(安卓)系统Gsensor系统架构
  8. Android(安卓)Recovery Ui 分析
  9. No 97 · 在Android中查看和管理sqlite数据库

随机推荐

  1. PS合成技巧、改日期时间、修图改字、换背
  2. 在虚拟机中运行 Linux 的十大优点
  3. js对象、函数、日期对象----简易日历
  4. JavaScript格式的计算器以及乘法表
  5. JS 简单计算器、九九乘法表实例演示
  6. 文件本质与作用、关键字的学习
  7. Unity程序结合云渲染技术在手机中使用要
  8. CSS:模态框定位实战
  9. Android的自动测试研究--Robotium
  10. Qt on Android(安卓)Episode 3(翻译)