Android 数据存储

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

getPreferences  Activity类中的方法,只需指定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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值