Android的数据存储
Android为用户的本地数据存储提供了多种方式,用户可以根据具体的需求选择合适的存储方式,将数据保存到各种存储介质上。本地数据的存储方式包括SharedPreferences、SD卡存储和SQLite数据库存储。
android的数据三种存储方式:
- SharedPreferences存储
- 文件存储
- SQLite存储
SharedPreferences存储
SharedPreferences存储的应用场景
SharedPreferences存储是Android系统中最容易使用的存储技术,是一种轻量型的Android数据存储方案,主要用于保存应用程序的一些配置信息,如登录的用户信息、播放音乐退出时的状态、设置选项等。
SharedPreferences将一些简单数据类型的数据,心键值对的形式保存在应用程序的私有Preferences目录中。SharedPreferences对象本身只能获取数据,数据的存储和修改只能通过SharedPreferences内部接口Editor来实现。
SharedPreferences的使用方法
1.获取SharedPreferences对象有两种方式:
- 使用PreferenceManager.getDefaultSharedPreferences()方法获取;
- 使用Activity的getSharedPreferences(String name,int mode)方法获取,它的第一个参数是文件名称,第二个参数是访问模式。
例如:
SharedPreferences pref =
PreferenceManager.getDefaultSharedPreferences(MainActivity.this);
SharedPreferences pref =
getSharedPreferences("mypref",Activity.MODE_PRIVATE);
1.1 getDefaultSharedPreferences()和getSharedPreferences()的区别:
- 自定义的一些设置通过文件名用getSharedPreferences()方法获取;
- 应用默认的偏好文件preferences.xml通过getDefaultSharedPreferences()方法获取。
1.2 SharedPreferences支持以下访问模式:
- MODE_PRIVATE:私有,代表该文件是私有数据只能被应用程序本身访问,在该模式下,写入的内容会覆盖原文件的内容。
- MODE_APPEND:该模式会检查文件是否存在,存在就向文件中追加内容,否则创建新文件。
- MODE_WORLD_READABLE:全局读,创建程序有读取或写入的权限,其他程序也有读取的权限,但不能写入。
- MODE_WORLD_WRITEABLE:全局写,创建程序和其他程序仅有的写入的权限。
1.3 SharedPreferences内部接口Editor:
该接口提供了保存数据的方法,如putString(String key,String value)等。
Editor editor = pref.edit();
2. 保存SharedPreferences数据
通过Editor对象保存:
editor.putString("name","王艳");
editor.putInt("age",18);
editor.putBoolean("default",true);
editor.commit();
3. 读取SharedPreferences数据
String name = pref.getString("name","");
int age = pref.getInt("age",0);
4. 清除SharedPreferences数据
使用SharedPreferences对象的remove()方法删除特定值,删除所有的值就调用clear()方法。
//删除特定值
editor.remove("name");
editor.remove("time");
editor.commit();
//删除所有值
editor.clear();
editor.commit();
5. 使用SharedPreferences的注意事项:
- 通过edit()获取一个新的编辑器对象进行写入,设置完成后必须调用commit()方法才能写入磁盘文件,否则重启应用后,数据就会丢失。
- 必须使用局部变量保存获取到的edit()编辑器对象,而不能每项都通过edit()方法进行操作,因为每次调用edit()方法都会生成新的对象实例,操作的将还是同一个对象。
- 读取已存储的数据是通过SharedPreferences对象本身获取的,而不再是editor对象。获取数据时必须指定默认值。
文件存储
SharedPreferences只能存储一些简单的数据,而android应用程序在使用过程中,可能需要使用SD卡中的照片、视频等文件,因此文件存储的应用比较广泛。
Android的文件系统分为两类
1. 内部存储
内部存储的文件在预设的情况下只有应用程序可以使用。内部存储的文件保存在/data/data/< package name>/files目录中,应避免直接使用绝对路径,android提供了相应的API获取内部存储设备的路径。
- getFilesDir():返回应用程序在内部存储设备中的路径。
- getCacheDir():返回应用程序在内部存储设备中的缓存文件路径。
- Context类提供了文件和目录管理的方法:

- 调用openFileOutput()方法,返回一个FileOutputStream对象。
- 使用write()方法将数据写入文件。
- 使用close()方法关闭文件流。
代码如下:
//向指定的文件写入数据
public void writeFileData(String filename, String message){
try{
//MODE_PRIVATE模式写入的内容会覆盖原文件的内容
FileOutputStream out = openFileOutput(filename, MODE_PRIVATE);
//将要写入的字符串转换为byte数组
byte[] bytes = message.getBytes();
out.write(bytes);//将byte数组写入文件
out.close();//关闭文件输出流
}catch(Exception e){
e.printStackTrace();
}
}
1.2 从内部存储中读取一个文件的步骤如下:
- 创建输入流。
- 使用read()方法读取文件的内容。
- 使用close()方法关闭文件输入流。
//打开指定文件,读取其数据,返回字符串对象
public String readFileData(String fileName){
String result = "";
try{
FileInputStream in = openFileInput(fileName);
//获取文件长度
int lenght = in.available();
byte[] buffer = new byty[lenght];
in.read(buffer);
//将byte数组转换成指定格式的字符串
result = EncodingUtils.getString(buffer,ENCODING);
in.close();
}catch(Exception e){
e.printStackTrace();
}
return result;
}
2. 外部存储
外部存储卡一般存储一些容量较大的文件,因为就此存储卡随时可以被卸载,所以在使用前最好先判断是否可以存取。代码如下:
//判断外部存储设备是否可写入
public static boolean isExternalStorageWritable(){
//取得目前外部存储设备的状态
String state = Environment.getExternalStorageState();
//判断是否可写入
if(Environment.MEDIA_MOUNTED.equals(state)){
return true;
}
return false;
}
//外部存储设备是否可读取
public static boolean isExternalStorageReadable(){
//取得目前外部存储设备的状态
String state = Environment.getExternalStorageState();
//判断是否可读取
if(Environment.MEDIA_MOUNTED.equals(state)||
Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)){
return true;
}
return false;
}
检测完外部存储是否可读或可写,getExternalStorageState()方法可返回检测的状态。

SQLite存储
1. SQLite的基本概念
Android系统内建了SQLite。可以在所有主流的操作系统上运行,支持大多数计算机语言。它支持的相信类型可有5种,但实际上它也接收varchar、char、decimal等类型,SQLite会在运算或保存时将它们转换为对应的5种数据类型。

在android系统中,SQLiteDatabase类代表一个SQLite对象,即对应一个底层的数据库文件,当应用程序获得SQLite对象后,就可以通过该对象来进行数据库的管理和操作了。SQLiteDatabase提供了创建数据库、创建表和执行SQL语句的常用方法。

- OPEN_READWRITE:可读写方式。
- OPEN_READONLY:只读方式。
- CREATE_IF_NECESSARY:当数据库文件不存在时,创建该数据库。
- NO_LOCALIZED_COLLATORS:打开数据库时,不根据本地化语言对数据进行排序,可以使用以上四个参数中的一个或多个。
3. SQLiteOpenHelper
SQLiteOpenHelper类是SQLiteDatabase的一个辅助类。这个类主要作用是生成一个数据库,并对数据库的版本进行管理。当在程序中调用这个类的方法getWritableDatabase()或者getReadableDatabase()方法的时候,如果当时没有数据,那么android系统会自动生成一个数据库。SQLiteOpenHelper类是一个抽象类,通常需要继承它并且实现其中的2个方法。
- 在数据库第一次生成的时候,系统会调用以下方法。
onCreate(SQLiteDatabase)
- 当数据库需要升级的时候,系统会调用以下方法。
onUpgrade(SQLiteDatabase,int,int)