瞬时数据:存储在内存中,有可能会因为程序关闭或其他原因导致内存被回收而丢失的数据
数据持久化:将内存中的瞬时数据保存到存储设备中
Android系统中主要提供了3种方式用于简单地实现数据持久化功能:
- 文件存储。对应的目录是:/data/data/<包名>/files/*
- SharedPreferences存储。对应的目录是:/data/data/<包名>/shared_prefs
- 数据库存储。对应的目录是:/data/data//<包名>/database
一、文件存储
适合用于存储一些简单的文本数据或二进制数据
1、将数据存储到文件中
Context.openFileOutput(文件名, 操作模式)
参数:
(1)文件名
不可以包含路径,默认存储到 /data/data/<包名>/files/ 目录下
(2)操作模式
1)MODE_PRIVATE
默认的模式。当指定同样的文件名时,所写入的内容将会覆盖原文件中的内容
2)MODE_APPEND
表示如果该文件已存在,就往文件里面追加内容,不存在就创建新文件。
返回值:
FileOutputStream对象
代码示例:
public void save(){
String data = "Data to save"; //要进行文件存储的数据
FileOutputStream out = null;
BufferedWriter writer = null;
try{
out = openFileOutput("data", Context.MODE_PRIVATE);
writer = new BufferedWriter(new OutputStreamWriter(out));
writer.write(data);
}catch(IOException e){
e.printStackTrace();
}finally{
try{
if(writer != null){
writer.close();
}
}catch(IOException e){
e.printStackTrace();
}
}
}
2、从文件中读取数据
Context.openFileInput(要读取的文件名)
系统会自动到 /data/data/<包名>/files/目录下去加载这个文件,并返回一个FileInputStream对象
public String load(){
FileInputStream in = null;
BufferedReader reader = null;
StringBuilder content = new StringBuilder();
try{
in = openFileInput("data");
reader = new BufferedReader(new InputStreamReader(in));
String line = "";
while((line = reader.readLine()) != null){
content.append(line);
}
}catch(IOException e){
e.printStackTrace();
}finally{
if(reader != null){
try{
reader.close();
}catch(IOException e){
e.printStackTrace();
}
}
}
return content.toString();
}
二、SharedPreferences存储
SharedPreferences基于XML文件存储key-value键值对数据,通常用来存储一些简单的配置信息,其存储位置在“/data/data/<包名>/shared_prefs”目录下。
SharedPreferences对象本身只能获取数据而不支持存储和修改,存储修改是通过Editor对象实现的。
1、使用SP存取数据
(1)存储数据:
示例代码:
SharedPreferences.Editor editor = getSharedPreferences("data", MODE_PRIVATE).edit();
editor.putString("name","Tom");
editor.putInt("age",28);
editor.putBoolean("married", false);
editor.commit();
其中,获取SP对象有三种方式
①Context类中的getSharedPreferences()方法
Context.getSharedPreferences(文件名, 操作模式)
文件名:如果文件不存在则会创建一个,将指定的文件存放在“/data/data/<包名>/shared_prefs”目录下
操作模式:目前只有MODE_PRIVATE这一种模式,是默认的操作模式,表示只有当前的应用程序才可以对这个SharedPreferences文件进行读写
②Activity类中的getPreferences()方法
Activity.getPreferences(操作模式)
类似于Context.getSharedPreferences方法,但此方法自动将当前活动的类名作为SP的文件名。
③PreferenceManager类中的getDefaultSharedPreferences()方法
PreferenceManager.getDefaultSharedPreferences(Context)
静态方法。
自动使用当前应用程序的包名作为前缀来命名SharedPreferences文件。
(2)读取数据
示例代码:
SharedPreferences pref = getSharedPreferences("data", MODE_PRIVATE);
String name = pref.getString("name", "默认值");
int age = preg.getInt("age", 0);
boolean married = pref.getBoolean("married", false);
(3)删除指定数据
示例代码:
SharedPreferences.Editor editor = getSharedPreferences("data", MODE_PRIVATE).edit();
editor.remove("name");
editor.commit();
(4)清空数据
示例代码:
SharedPreferences.Editor editor = getSharedPreferences("data", MODE_PRIVATE).edit();
editor.clear();
editor.commit();
2、关于SP的一些注意事项
(1)SP加载的主要过程
SP加载的主要过程:
1)找到对应name的文件
2)加载对应文件到内存中的SP
3)一个xml文件对应一个SP单例
(2)提交数据时的commit()方法和apply()方法
提交数据时有commit和apply两种方式:
1)apply没有返回值而commit返回boolean表明修改是否提交成功 ;
2)commit是把内容同步提交到硬盘的,而apply先立即把修改提交到内存,然后开启一个异步的线程提交到硬盘,并且如果提交失败,你不会收到任何通知。
3)所有commit提交是同步过程,效率会比apply异步提交的速度慢,在不关心提交结果是否成功的情况下,优先考虑apply方法。
4)apply是使用异步线程写入磁盘,commit是同步写入磁盘。所以我们在主线程使用的commit的时候,需要考虑是否会出现ANR问题。(不适合大量数据存储)
(3)Sharedpreferences只适合做轻量级存储的原因
1)我们在初始化SharedPreferencesImpl对象时会将SharedPreferencesImpl对应的xml文件中的所有数据都加载到内存中,如果xml文件很大,将会占用大量的内存,我们只想读取xml文件中某个key的值,但我们获取它的时候是会加载整个文件。
2)在UI线程中调用getXXX可能会导致ANR。
3)每添加一个键值对,都会重新写入整个文件的数据,不是增量写入。
(4)Sharedpreferences支持的数据类型
只能存储boolean,int,float,long和String五种简单的数据类型
三、SQLite
1、简介
关系型数据库
嵌入式的数据库(嵌入在Android系统中)
用于嵌入式设备:手表、手机
2、SQLite数据库的使用
3、SQLite支持的数据类型
SQLite3支持 NULL、INTEGER、REAL(浮点数字)、TEXT(字符串文本) 和 BLOB(二进制对象)这五种数据类型,
虽然它支持的类型只有五种,但实际上 sqlite3 也接受 varchar(n)、char(n)、decimal(p, s) 等数据类型,只不过在运算或保存时会转成对应的五种数据类型。