数据存储
Android的数据存储有5种,分别为文件存储,SharedPreferences、SQLite数据库、ContentProvifer以及网络存储。
- 文件存储:常用的存储方式,读写文件,与Java中实现I/O程序完全一样。
- 有两种形式:XML以及JSON。
- SharedPreferences:存储一些简单的信息的一种机制。采用XML格式将数据存储到设备中,可以存储用户的各种配置信息如用户名和密码等。
- SQLite数据库:Android自带的数据库,支持基本的SQL语法。一般用作复杂数据的存储引擎。
- ContentProvifer:Android四大组件之一,主要用于不同程序之间的数据交换。将自己的数据共享给其他人。
- 网络存储:将数据存储在服务器上,通过网络提供存储空间来获得数据信息。
集中方法各有优缺点,根据性能需求,空间需求,等来确定选择哪种存储方式。
一、文件存储
通过 I/O 流的形式把数据直接存储到文档中。Android中的文件存储分为内部存储和外部存储。
内部存储
指将应用程序中的数据以文件方式存储到设备内部(该文件默认位于data/data/<packagename>
目录下),内部存储方式存储文件被其所创建的应用程序私有,如果其他应用程序要操作本应用程序中的文件,需要设置权限。当创建的应用程序卸载时,其内部存储文件也随之被删除。
内部存储使用的是Context提供的openFileOutput()方法和openFileInput()方法,这两个方法可以分别获取FileOutputStream对象和FileInputStream对象。然后进行读写操作。然后进行读写操作。
FileOutputStream fos = openFileOutput(String name,int mode);
FileInputStream fis = openFileInput(String name);
openFileOutput()用于打开应用程序的对应的输出流,将数据存储到指定的文件中。两个参数,name代表文件名,modo代表文件的操作模式。
- MODE_APPEND:该文件的内容可以追加。
- MODE_PRIVATE:该文件只能被当前程序读写。
- MODE_WORLD_READABLE:该文件的内容可以被其他程序读。
- MODE_WORLD_WRITEABLE:该文件的内容可以被其他程序写。
注意:Android系统有一套自己的安全模型,默认情况下任何应用创建的文件都是私有的,其他程序无法访问。除非在文件中指定了操作模式为MODE_WORLD_READABLE或者MODE_WORLD_WRITEABLE。如果希望外部文件能被其他程序进行读写操作。需要同时指定MODE_WORLD_READABLE和MODE_WORLD_WRITEABLE权限。
外部存储
将文件存储到外部设备上,如SD卡或内嵌入的存储卡,(该文件通常位于mnt/sdcard目录下,不同的厂商生产的手机路径可能会不同)外部存储文件可以被其他应用程序所共享,当外部存储设备连接到计算机时,这些文件可以被浏览,修改和删除因此这种方式不安全。
由于外部设备可能被移除,丢失或处于其他状态,因此在使用外部设备之前必须使用 Environment.getExternal
StorageState()当法来确认外部设备是否可用。当外部设备可用并且具有读写权限时,那么就可以通过FileInputStream、FileOutputStream对象来读写外部设备中的文件。
文件存储工具类示例
package top.codebooks.datastorage;
/**
* 文件存储工具类
*/
import android.content.Context;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
public class FileSaveQQ {
// 保存QQ账号和登录名到data.txt文件中
public static boolean saveUserInfo(Context context,String number ,String password){
try {
FileOutputStream fos = context.openFileOutput("data.txt",
Context.MODE_PRIVATE);
fos.write((number+":"+password).getBytes());
fos.close();
return true;
} catch (Exception e) {
e.printStackTrace();
e.printStackTrace();
return false;
}
}
// 从data.txt文件中获取存储的QQ账号和密码
public static Map<String,String> getUserInfo(Context context){
String content = "";
try {
FileInputStream fis = context.openFileInput("data.txt");
byte[] buffer = new byte[fis.available()]; // 创建缓冲区并获取文件长度
fis.read(buffer);
content = new String(buffer);
Map<String,String>userMap = new HashMap<String, String>();
String [] infos = content.split(":");
userMap.put("number",infos[0]);
userMap.put("password",infos[1]);
fis.close();
return userMap;
} catch (IOException e) {
e.printStackTrace();
return null;
}
}
}
二、XML解析
XML文件有三种解析方式,分别是DOM解析,SAX解析和PULL解析。
-
DOM解析
DOM解析会将文件中的内容以DOM树(文档树)的形式存放在内存中,然后通过DOM API进行遍历、兼做所需的数据,根据树的结构一节点的形式来对树进行操作。支持删除修改等功能。
值得注意的是。DOM需要先将整个XML文件存放在内存中,消耗内存较大因此较大文件不建议采用这种方法解析。
-
SAX解析
SAX解析会逐行扫描XNL文件,当遇到标签是出大解析处理器,采用事件处理的方式解析XML文件,再读取得时候可以进行解析处理,因此可解析超大型的文件。SAX解析只能读取XML中的文件,无法进行增、删、改等功能。
-
PULL解析
PULL解析是一个开源项目,可以用于Android也可用于Java EE项目,Android继承了PULL解析器,在Android中常用的解析方式就是PULL解析。
PULL解析文档,要先创建XmlPullParser解析器该解析器提供了很多属性,通过这些属性可以解析出XML文档的各个节点内容。
三、JSON 解析
-
JSON数据
JSON 即Javascript Object Notation(对象表示法),是一种轻量级数据交换格式。
-
JSON有两种数据结构
-
对象结构:以
{
开始,以}
结束,中间部分有0个或多个以,
分隔的kay:value
对构成,注意关键之和值之间以:
分隔。{ key1:value1, key2:value2, ... }
-
数组结构:以
[
开始]
结束,中间部分由0个或多个以,
分隔的列表组成。[ "name":"zhangsan" "key1":{ key1:value1, key2:value2 }, "hobby":["篮球","羽毛球","游泳"] ] /***********************************/ [ value1, value2, ..... ]
-
-
JSON解析
-
两种解析方式,1、Android内置的org.json包。2、通过Google开源的Gson库。
-
例如对一下JSON数据进行解析
{"name":"zhangsan","age":27,"married":tree} // json1的一个数据对象 [16,2,26] // Json2的一个数据对象
-
使用org.json解析JSON数据
-
对象结构:使用JSONObject
JSONObject jsonObject = new JSONObject(json1); String name =jsonObject.optString("name"); int age = jsonObject.optInt("age"); boolean married = jsonObject.optBoolean("married");
-
数组结构:使用JSONArray
JSONArray jsonArray = new JSONArray(json2); for (int i = 0; i < jsonArray.length(); i++) { int age = jsonArray.optInt(i); }
-
代码中使用了optlnt()方法,这种方法在解析数据时,如果对应的字段不存在,则会返回空值或则0,不会报错。
-
-
使用Gson解析JSON数据
- 使用时要先将gson.jar添加到项目中
- 要先创建JSON数据对应的实体类Persion,注意:实体类中的成员名称要与JSON数据的key值一致。
-
对象结构
Gson gson = new Gson(); Person person = gson.fromJson(json1,Person.class);
-
数组结构
Gson gson = new Gson(); Type listTyoe = new TypeToken<List<WeatherInfo>>(){}.getType(); List<WeatherInfo> weatherInfos = gson.fromJson(json2,listTyoe);
四、SharedPreferences
SharedPreferences是Android上一个轻量级的存储类,主要用于存储一些应用程序的配置参数,如用户名、密码、自定义参数等。他是通过key/value(键值对)的新世将数据保存在XML文件中。SharedPreferences键值对中的值只能是Float、Int、LongBoolean、String、StringSet等数据类型。