ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Android-10-数据存储

2021-05-09 23:05:16  阅读:146  来源: 互联网

标签:XML 10 存储 文件 JSON Android 解析


1.数据存储方式


(1)文件存储:该存储方式是一种较常用的方法,在Android中读取/写入文件的方法,提供了openFileInput()和 openFileOutput()方法来读取设备上的文件。可以存储大数据,如文本、图片、音频等。
(2)SharedPreferences:它是Android提供的用来存储一些简单的配置信息的一种机制,采
用了XML格式将数据存储到设备中。可以存储应用程序的各种配置信息,如用户名、密码等。
(3)SQLite数据库: SQLite 是Android自带的一个轻量级的数据库,支持基本SQL语法,利
用很少的内存就有很好的性能,-般使用它作为复杂数据的存储引擎,可以存储用户信息等。
(4)ContentProvider: Android 四大组件之一,主要用于应用程序之间的数据交换,它可以将
自己的数据共享给其他应用程序使用。
(5)网络存储:需要与Android网络数据包打交道,将数据存储到服务器上,通过网络提供的
存储空间来存储/获取数据信息。


2.文件存储

      文件存储分很多种形式,JSON与XML都是比较常用的,XML存储的数据结构比较清晰,而JSON更轻量级,使用更简单。文件存储是Android中最基本的一种数据存储方式,它与Java中的文件存储类似,都是通过l/O流的形式把数据直接存储到文档中。不同的是,Android 中的文件存储分为内部存储和外部存储。
      (1)内部存储是指将应用程序中的数据以文件方式存储到设备的内部(该文件默认位于data/data/<packagename>/iles/目录下),内部存储方式存储的文件被其所创建的应用程序私有,如果其他应用程序要操作本应用程序中的文件,需要设置权限。当创建的应用程序被卸载时,其内部存储文件也随之被删除。
      内部存储使用的是Context提供的openFileOutput()方法和openFilelnput()方法,通过这两个方法可以分别获取FileOutputStream对象和FilelnputStream对象,然后进行读写操作,示例

FileOutputstream fos = openFileOutput (String name, int mode);
FileInputStream fis=openFileInput (String name) ;

在上述代码中,openFileOutput()用于打开应用程序中对应的输出流,将数据存储到指定的文件中; openFilenput)用于打开应用程序对应的输入流,读取指定文件中的数据;其中参数"name”表示文件名,"mode" 表示文件的操作模式,也就是读写文件的方式,它的取值有4种,具体如下。
●MODE PRIVATE:该文件只能被当前程序读写;
●MODE APPEND:该文件的内容可以追加;
●MODE_WORLD_READABLE:该文件的内容可以被其他程序读;
●MODE_ WORLD_ WRITEABLE: 该文件的内容可以被其他程序写。
       Android系统有一套自己的安全模型,默认情况下任何应用创建的文件都是私有的,其他程序无法访问,除非在文件创建时指定了操作模式为MODE _WORLD_READABLE或者MODE_WORLD_WRITEABLE。 如果希望文件能够被其他程序进行读写操作,需要同时指定MODE WORLD _READABLE和MODE WORLD_ WRITEABLE权限。
      存储数据时,使用FileOutputStream对象将数据存储到文件中,示例代码如下。

String fileName = "data.txt"; //文件名称
String content = "helloworld"; //保存数据
FileOutputStream fos;
try {
fos = openFileOutput (fileName, MODE PRIVATE) ;
fos. write (content.getBytes()); ! //将数据写入文件中
fos.close() ;/ /关闭输出流
} catch (Exception e) {
e.printStackTrace() ;
}

取出数据时,使用FilenputStream对象读取数据,示例代码如下。

String content =”";
FileInputStream fis;
try {
fis= openFileInput ("data. txt") ;//获得文件输入流对象
byte[] buffer = new byte [fis. available()];//创建缓冲区,并获取文件长度
fis. read (buffer) ;//将文件内容读取到buffer缓冲区
content = new string (buffer);//转换成字符串
fis.close() ;//关闭输入流
} catch (Exception e) {
e.printstackTrace() ;
}

(2)外部存储

      外部存储是指将文件存储到一些外部设备上,例如SD卡或者设备内嵌的存储卡,属于永久性的存储方式(该文件通常位于mnt/sdcard目录下,不同的手机路径不同)。外部存储的文件可以被其他应用程序所共享,当将外部存储设备连接到计算机时,这些文件可以被浏览、修改和删除,因此这种方式不安全。由于外部存储设备可能被移除、丢失或者处于其他状态,因此在使用外部设备之前必须使用Environment.getExternalStorageState()方法来确认外部设备是否可用,当外部设备可用并且具有读写权限时,那么就可以通过FileInputStream、FileOutputStream 对象来读写外部设备中的文件。
      向外部设备(SD卡)中存储数据的示例代码如下。

String state = Environment . getExternalStorageState(); // 获取外部设备,判断是否存在SD卡
if (state .equals (Envi ronment . MEDIA MOUNTED)) {//判断外部设备是否可用
File SDPath = Envi ronment . getExternalStorageDirectory();//获取SD卡目录
File file = new File (SDPath,"data.txt");
String data = "HelloWorld";
FileOutputStream fos;
try {
fos = new FileOutputStream(file);
fos.write (data.getBytes());
fos.close() ;
} catch (Exception e) {
e.printStackTrace();
}
}

      从外部设备(SD卡)中读取数据的示例代码如下。

String state =Envi ronment . getExternalStorageState() ;
if (state .equals (Envi ronment . MEDIA MOUNTED)) {
File SDPath = Envi ronment. getExternalStorageDi rectory() ;
File file = new File (SDPath, "data. txt") ;
FileInputStream fis;
try{
fis = new FileInputStream(file) ;
BufferedReader br = new Buf feredReader (new InputStreamReader (fis));
String data = br. readLine() ;
} catch (Exception e){
e.printStackTrace() ;
}
}

需要注意的是,Android系统为了保证应用程序的安全性做了相应规定,如果程序需要访问系统的一些关键信息,必须要在清单文件中声明权限才可以,否则程序运行时会直接崩溃。由于操作SD卡中的数据属于系统中比较关键的信息,因此需要在清单文件的<manifest>节点中添加SD卡的读写权限,示例代码如下。

<uses-permission android: name="android. permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android. permission.READ_EXTERNALSTORAGE"/>

3.XML解析 

      XML在各种开发中应用都很广泛,在Android中若要操作XML文件,首先需要将XML文件解析出来。通常情况下,XML文件有3种解析方式,分别是DOM解析、SAX解析和PULL解析,接下来针对这3种方式进行简单的介绍。
(1)DOM解析
      DOM解析会将XML文件中所有内容以DOM树(文档树)形式存放在内存中,然后通过DOM API 进行遍历、检索所需的数据,根据树结构以节点形式来对文件进行操作,支持删除、修改功能。需要注意的是,由于DOM需要先将整个XML文件存放在内存中,消耗内存较大,因此,较大的文件不建议采用这种方式解析。
(2)SAX解析
      SAX解析会逐行扫描XML文件,当遇到标签时触发解析处理器,采用事件处理的方式解析XML文件。它在读取文件的同时即可进行解析处理,不必等到文件加载结束,相对快捷,可解析超大的XML文件。缺点是SAX解析只能读取XML中的数据,无法进行增、删、改功能。
(3)PULL解析
      PULL解析是一个开源的Java项目,既可以用于Android应用,也可以用于JavaEE程序。Android已经集成了PULL解析器,因此,在Android中最常用的解析方式就是PULL解析。
      使用PULL解析XML文档,首先要创建XmlPullParser解析器,该解析器提供了很多属性,通过这些属性可以解析出XML文件中的各个节点内容。
      XmlPullParser的常用属性如下:
      ●XmlPullParser START DOCUMENT: XML文档的开始,如<?xml version="1.0" encoding="utf-8"?>。
      ●XmlPullParser.END DOCUMENT: XML文档的结束。
      ●XmlPullParser.START TAG:开始节点,在XML文件中,除了文本之外,带有尖括号< >的都是开始节点,如<weather>。
      ●XmlPullParser.END TAG: 结束节点,带有</ >的都是结束节点,如</weather>。

4.JSON解析

Android平台上有两种解析技术,一种是通过 Android内置的org.json包,一种是通过Google的开源Gson库,

{"name": "zhang","age": 27,"married":true}    //json1是一个json对象
[16,26,3]                    //json2是一个数字数组

(1)使用org.json解析JSON数据
Android SDK中为开发者提供了org.json, 可以用来解析JSON数据。由于JSON数据只有JSON对象和JSON数组两种结构,因此org.json包提供了JSONObject和JSONArray两个类对JSON数据进行解析。
      使用JSONObject解析JSON对象,示例代码如下。

JSONObject json0bj = new JSONobject (json1) ;
String name = jsonObj . optstring ("name") ;
int age =jsonObj .optInt ("age") ;
boolean married =jsonObj . optBoolean ("married");

      使用JSONAray解析JSON数组,示例代码如下。

JSONArray  jsonArray = new JSONArray (json2);
for(int i= 0; i< jsonArray. length(); i++){
int age = jsonArray.optInt(i);
}

     从上述代码可以看出,数组的解析方法和对象类似,只是将key值替换为数组中的下标。另外,代码中用到了optInt()方法, 这种方法在解析数据时是安全的,如果对应的字段不存在,则返回空值或者0,不会报错。
(2)使用Gson解析JSON数据
Gson库是由Google提供的,若要使用Gson库,首先需要将gson,jar添加到项目中,然后才能调用其提供的方法。
使用Gson库之前,需要创建JSON数据对应的实体类Person,需要注意的是,实体类中的成员名称要与JSON数据的key值一致。 该Person类比较简单,初学者自行创建即可。
   使用Gson解析JSON对象,示例代码如下。

Gson gson = new Gson() ;
Person person=gson. fromJson(jsonl, Person.class) ;

   使用Gson解析JSON数组,示例代码如下。

Gson gson = new Gson() ;
Type listType =new TypeToken<List<Integer>>l){}.getType();
List<Integer> ages = gson. fromJson (json2,listType) ;

5.SharedPreferencesd的使用

 

标签:XML,10,存储,文件,JSON,Android,解析
来源: https://blog.csdn.net/qq_42759120/article/details/116568590

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有