一、数据存储
本文主要讲前两种存储方式,其中文件读写只记录Internal Storage方式
1. SharedPrefrences方式
轻量级NVP方式存储,以XML的文件方式保存,适合少量数据的存储。
NVP:Name/Value pair, 名称/值 对。
2. 文件读写
采用Java.io.*库提供的I/O接口读写文件
3. SQLite数据库
轻量级嵌入式内置数据库
4. ContentProvider
封装各种数据源(文件、数据库、网络),共享给多个应用
二、sharedPreferences使用
1. 定义访问模式
public static int MODE = MODE_PRIVATE;
MODE_PRIVATE为私有模式,仅创建程序可读写。
另外还有全局读(MODE_WORLD_READABLE)和全局写(MODE_WORLD_WRITEABLE)模式,但现在的版本是没办法使用的了,因为不安全。
2. 定义SharedPreferences的名称
public final static String PREFERENCE_NAME = "MyPassword";
使用该名称,建立的xml文件也与这个同名,同时,相同名称的NVP内容,都会被保存在同一文件中。
3. 创建SharedPreferences对象
SharedPreferences sharedPreferences = getSharedPreferences(PREFERENCE_NAME, MODE);
将访问模式和名称作为参数,传递给getSharedPreferences函数,并获得实例对象。
4. 添加数据
SharedPreferences.Editor editor = sharedPreferences.edit();
通过SharedPreferences.Editor类来进行数据的添加。
editor.putString("password", "123456");
editor.putInt("number", 10);
通过键值对进行存储。且支持多种数据类型,通过AS的补全就可以知道。
editor.commit();
注意添加完数据之后需要加上上面这一句,将数据保存到xml文件中去。如果不添加,读取数据的时候文件还会是空白的。
5. 读取数据
String name = sharedPreferences.getString("password","null");
int age = sharedPreferences.getInt("Age", 0);
通过get()函数获取NVP,第一个参数为NVP的Name,第二个参数是找不到该数值的时候使用的缺省值。
如果先添加数据再读取数据,则
password == "123456"
age == 10
若未添加数据的时候就读取数据,则
password == "null"
age == 0
正确设置缺省值并通过判断缺省值可以做很多事情,比如应用第一次启动时。
三、文件读写存储
1. openFileOutput()
用于将应用的数据写入指定文件,如果文件不存在,则创建一个新文件。
语法格式
public FileOutputStream openFileOutput(String name, int mode)
返回FileOutputStream类型
name为文件名称,不能包含描述路径的斜杆。
模式
- MODE_PRIVATE 覆盖已有文件
- MODE_APPEND 在已有文件后追加数据
- MODE_WORLD_READABLE 全局读,不安全,同上,已禁用
- MODE_WORLD_WRITEABLE 全局写,同上
使用
String filename = "MyData.txt";
try (FileOutputStream output = openFileOutput(filename, MODE_PRIVATE)) {
String str = editText.getText().toString();
output.write(str.getBytes());
output.flush();
output.close();
}
catch (IOException ex) {
//弹出警告窗口
}
为什么要用异常处理:因为文件读取容易出现异常,比如调用读入函数openFileInput时,文件不存在,如果不使用异常处理,程序很容易奔溃。
flush():为提高文件系统性能,一般调用write()函数时,如果写入数据量较少,系统会先将数据保存在缓冲区中,等数据积累到一定程度再一次下=性写入文件,因此close()之前一定要调用flush()函数,将缓冲区的剩余数据都写进文件中。
2. openFileInput()
用于打开一个与应用程序联系的私有文件输入流。
语法格式
public FileInputStream openFileInput (String name)
使用
try (FileInputStream input = openFileInput(filename)) {
byte[] contents = new byte[input.available()];
int len = input.read(contents);
StringBuilder sb = new StringBuilder("");
sb.append(new String(contents, 0, len));
input.close();
editText.setText(sb.toString());
}
catch (IOException ex) {
//弹出警告窗口
}
剩余两个数据存储方式之后再记录。