android数据存储主要有三种方式:文件存储、SharedPreferences存储、SQLite数据库存储
一、文件存储
1. 写数据:Context类的openFileOutput(String fileName,int authority)方法。
参数说明:
a、fileName:文件名。不可以包含路路径,因为使用的是默认路路径/data/data
b、authority:权限。主要有两种模式可选——MODE_PRIVATE和MODE_APPEND,其他模式因为安全性,在Android4.2后已经废弃。private模式是覆盖擦写模式,append模式是追加内容模式, append模式在没有文件时会创建新文件,private模式则待验证。
2、读数据:Context类的openFileInput(fileName)方法。
参数说明:
a、fileName:要读取数据的文件名。不可以包含路路径,因为使用的是默认路路径/data/data
3、使用示例:
1 //数据直接写
2 public static void originalWriteData(String filename, String data, Activity activity) {
3 FileOutputStream fileOutputStream = null;
4 BufferedWriter bufferedWriter = null;
5 try {
6 //构建数据传输通路
7 fileOutputStream = activity.openFileOutput(filename, Context.MODE_PRIVATE);
8 bufferedWriter = new BufferedWriter(new OutputStreamWriter(fileOutputStream));
9 //写入数据
10 bufferedWriter.write(data);
11 } catch (Exception e) {
12 //会抛出异常,比如找不到文件异常 java.io.FileNotFoundException
13 e.printStackTrace();
14 } finally {
15 try {
16 //用完记得关闭数据通路
17 if (bufferedWriter != null) {
18 bufferedWriter.close();
19 }
20 } catch (Exception e) {
21 e.printStackTrace();
22 }
23 }
24 }
25
26 //数据直接读方法
27 public static String originalReadData(String filename, Activity activity) {
28 FileInputStream fileInputStream = null;
29 BufferedReader bufferedReader = null;
30 //StringBuilder是字符串变量,执行速度最快,但是线程不安全,StringBuffer线程安全,速度稍慢
31 StringBuilder dataBuilder = new StringBuilder();
32 try {
33 //构建数据传输通路
34 fileInputStream = activity.openFileInput(filename);
35 bufferedReader = new BufferedReader(new InputStreamReader(fileInputStream));
36 //读取数据,String是字符串常量,速度最慢
37 String line = "";
38 while ((line = bufferedReader.readLine()) != null) {
39 dataBuilder.append(line);
40 }
41 } catch (Exception e) {
42 e.printStackTrace();
43 } finally {
44 try {
45 if (bufferedReader != null) {
46 //关闭数据通路
47 bufferedReader.close();
48 }
49 } catch (Exception e) {
50 e.printStackTrace();
51 }
52 }
53 //返回读取到的数据
54 return dataBuilder.toString();
55 }
二、SharedPreferences存储
1、写数据:
通过以下三种方式可获得SharePreferences对象:
(1)、Context类中的getSharedPreferences(String fileName,int authority)方法。
参数说明:
a、fileName:文件名。默认存放在/data/data/
b、authority:操作权限。只有MODE_PRIVATE一种模式可选,表示只有当前程序才可以这个SharedPreferences文件进行读写,其他模式分别在4.2和6.0中废弃。
(2)、Activity类中的getPreferences(int authority)方法。
参数说明:
a、authority:操作权限。自动将当前Activity的类名作为SharedPreferences文件的文件名。
(3)、PreferenceManager类中的getDefaultSharedPreferences(Context context)静态方法。
参数说明:
a、context:上下文环境。自动将当前程序的包名作为前缀来命名SharedPreferences文件。
使用步骤:
(1)、使用SharePreferences对象的edit()方法获取SharedPreferences.Editor对象。
(2)、向SharedPreferences.Editor对象中添加数据,比如使用putBoolean(String key,boolean boo)方法。
(3)、使用apply()方法提交数据,完成操作。
2、读数据:
使用SharedPreferences对象中与put方法相对应的一系列的get方法,即可读出数据。
参数说明:
a、key:键值。与对应put方法中的key要一致。
b、defaultValue:默认值。代表找不到键值的对应值时,返回的默认数据。
3、使用示例:
//使用SharedPreference写String数据——getSharedPreferences()
public static void SPWriteString(String filename, String key, String data, Activity activity) {
//getSharedPreferences是Context类的方法,MODE_PRIVATE是覆盖擦写
SharedPreferences.Editor editor = activity.getSharedPreferences(filename, Context.MODE_PRIVATE).edit();
//向editor对象添加数据
editor.putString(key, data);
//提交数据到文件
editor.apply();
}
//使用SharedPreference读String数据——getSharedPreferences()
public static String SPReadString(String filename, String key, Activity activity) {
//获得SharedPreferences对象
SharedPreferences sharedPreferences = activity.getSharedPreferences(filename, Context.MODE_PRIVATE);
//根据key键读取数据,设置无数据的默认返回值
String data = sharedPreferences.getString(key, "there is not data!");
return data;
}
//使用SharedPreference写String数据——getPreferences()
public static void SPWriteString_P(String key, String data, Activity activity) {
//getPreferences()自动将当前活动的类名作为文件名,所以不接收文件名参数
SharedPreferences.Editor editor = activity.getPreferences(Context.MODE_PRIVATE).edit();
editor.putString(key, data);
editor.apply();
}
//使用SharedPreference写String数据——getPreferences()
public static void SPwriteString_D(String key, String data, Activity activity) {
//使用PreferenceManager类的静态方法getDefaultSharedPreferences来构建Editor对象,文件名是应用程序包名
SharedPreferences.Editor editor = PreferenceManager.getDefaultSharedPreferences(activity).edit();
editor.putString(key, data);
editor.apply();
}
三、SQLite数据库
1、SQLite数据库有一个帮助类叫SQLiteOpenHelper,借助这个类,可以很简单的创建和升级数据库。
2、SQLiteOpenHelper帮助类是一个抽象类,我们要使用它,须新建一个自己的帮助类去继承它,并实现它的两个抽象方法onCreate()方法和onUpgrade()方法。
3、SQLiteOpenHelper两个重要的实例方法:
a、getReadableDataBase():创建或打开一个数据库(不存在则新建),返回一个可对数据库进行读写操作的对象,当数据库不可写入时(如磁盘空间已满),返回的对象将以只读的形式打开。
b、getWritableDataBase():创建或打开一个数据库(不存在则新建),返回一个可对数据库进行读写操作的对象,当数据库不可写入时(如磁盘空间已满),将抛出异常。
4、SQLiteOpenHelper可重写的两个构造方法:
(1)、SQLiteOpenHelper(Context context,String dataBaseName,Cursor cursor,String version);
参数说明:
a、context:上下文环境。
b、dataBaseName:数据库名称。
c、cursor:自定义cursor,一般传入null。
d、version:版本号;
(2)、一般只用第一种构造方法。