Android中三种数据存储方式:
SharedPreferences:轻量键-值方式存储,以xml文件方式保存
file management:采用java.io.*库所提供的I/O接口读写文件
SQLite databases:SQLite是轻量级嵌入式内置数据库
Android SharedPreferences的使用介绍
SharedPreferences是轻量级的数据保存方式;通过SharedPreferences可以将NVP(Name/Value Pair, 名称/值对)保存在Android的文件系统中,而且SharedPreferences完全屏蔽了对文件系统的操作过程;开发人员通过SharedPreferences对NVP进行保存和读取;
访问模式/数据共享
- 私有(Context.MODE_PRIVATE):数据只能被本应用读取
- 全局读(Context.MODE_WORLD_READABLE)数据能被其他应用程序读,但不能写
- 全局写(Context.MODE_WORLD_WRITEABLE)数据能被其他应用程序写,但不能读
获取SharedPreferences对象
定义SharedPreferences访问模式
下面的代码将访问模式定义为私有模式
public static int MODE = MODE_PRIVATE;
有时候需要将SharedPreferences的访问模式设定为既可以全局读,也可以全局写
public static int MODE = Context_MODE_WORLD_READABLE + Context.MODE_WORLD_WRITEABLE;
定义SharedPreferences文件名,这个文件名称与在Android文件系统中保存的文件同名
public static final String PREFERENCE_NAME = "SaveSetting";
将访问模式和SharedPreferences名称做为参数,传递到getSharedPrerences()函数,并获取到SharedPrerences对象
SharedPreferences sharedPreferences = getSharedPreferences(PREFERECES_NAME, MODE);
数据的写入
利用前面获取SharedPreferences对象的edit()方法获的它对应的Editor对象
利用Editor对象提供的PutXXX方法写入数据
调用Editor对象提供的commit()方法提交修改数据
SharedPreferences.Editor editor = sharedPreferences.edit();
editor.putString("Name","Tom");
editor.putInt("Age",20);
editor.putFloat("height",(float) 1.70);
editor.commit();
SharedPreferences.Editor clear() 清除所有数据
数据的读取
调用getSharedPreferences()函数,并在函数的第一个参数中指明需要访问的SharedPreferencs的名称
通过getXXX()函数获取保存在SharedPreferences中的NVP
SharedPreferences sharedPreferences = getSharedPreferences(PRIVATE_NAME, Mode);
String name = sharedPreferences.getString("Name","");
int age = sharedPreferences.getInt("Age", );
float height = sharedPreferences.getFloat("Height", );
getXXX()函数第一个参数是NVP的名称
第二个参数是在无法获取到数值的时候使用缺省值
数据的结构、位置和注意事项
其实,每装一个应用程序时,SharedPreferences文件就保存在data/data/< package name > /shared_prefs目录下,其中的文件就是我们的数据
dataStore.xml文件是以XML格式保存的信息,内容如图:
访问其他应用程序数据需要满足三个条件:
共享者将SharedPreferences的访问模式设置为全局读或全局写
访问者知道应用程序包名和SharedPreferences的名称
- 通过Context获取SharedPreferences对象
- 访问者确切知道每个数据的名称和数据类型
文件存储
Android允许应用程序创建仅能够自身访问的私有文件,文件保存在设备的内部储存器上面,在linux系统下的data/data/< packagename >/files 目录中。
Android支持标准java的IO流体系
FileInputStream类
FileOutputStream类
Context提供了能够简化读写流式文件过程的函数
openFileOutput():打开文件输入流
openFileInput():打开文件输出流
openFileOutput()函数
openFileOutput()函数用于写入数据。如果指定的文件夹不存在,则创建一个新的文件。
public FileOutputStream openFileOutput(String name, int mode)
第一个参数是文件名称,这个参数不可以包含描述路径的斜杠
第二个参数是操作模式
- 函数的返回值是FileOutputStream类型(字节流)
Android系统支持四种文件操作模式
模式 | 说明 |
---|---|
MODE_PRIVARE | 私有模式,文件仅能够被文件创建程序访问,或具有相同的UID的程序访问 |
MODE_APPEND | 追加模式,如果文件已经存在,则在文件的结尾处添加新数据 |
MODE_WORLD_READABLE | 全局读模式,允许任何程序读取私有文件 |
MODE_WORLD_WRITEABLE | 全局写模式,允许任何程序写入私有文件 |
使用openFileOutput()函数建立新文件的示例代码如下
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();
- 第1行代码定义了建立文件的名称fileDemo.txt
- 第2行代码使用openFileOutput()函数以私有模式建立文件
- 第3行代码调用write()函数将数据写入文件
- 第4行代码调用flush()函数将所有剩余的数据写入文件
- 第6行代码调用close()函数关闭FileOutputStream
**openFileOutput()函数
- 为了提高文件系统的性能,一般调用write()函数时,如果写入的数据量较小,系统会吧数据保存在数据缓冲区,等数据量累积到一定程度时在一次性的写入文件中
- flush()函数,可以将缓冲区内所有的数据写入文件
- 文件操作结束后,用close()关闭文件
openFileInput()函数
- openFileInput()函数用于打开一个与应用程序联系的私有文件输入流
- 当文件不存在时,抛出FileNotFoundException异常;
- openFileInput()函数的语法格式如下:
public FileInputStream openFileInput(String name)
- 第一个参数也是文件名称,同样不允许包含描述路径的斜杠
使用openFileInput()函数打开已有文件夹的示例代码如下
String FILE_NAME = "fileDemo.txt";
FileInputStream fis = openFileInput(FILE_NAME);
- –
byte[] readBytes = new byte[fis.available()];
while(fis.read(readBytes)!=-1){ }
上面两段代码在实际使用过程中会遇到错误提示,因为文件操作可能会遇到各种问题而最终导致操作失败,因为此代码应该使用try/catch捕获可能产生的异常