Android开发(2):数据存储之一:SharedPrefrences和文件读写

一、数据存储

本文主要讲前两种存储方式,其中文件读写只记录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) {
    //弹出警告窗口
}

剩余两个数据存储方式之后再记录。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值