Android数据持久化技术解析

发表时间: 2018-10-08 09:18

1、数据持久化

1.1 定义

数据持久化就是将内存中的瞬时数据保存到存储设备中,保证即使在手机或者是电脑关机的情况下,数据也不会丢失。

1.2 方式

在android中数据持久化分为三种:文件存储、SharedPreferences存储和数据库存储。

1.3 三种方式对比

数据持久化三种方式对比

方式保存路径涉及到的类特点文件存储/data/data/<packagename>/files///从文件中读取数据

Context.openFileInput(String fileName):FileInputStream

//将数据存储到文件中

Context.openFileOutput(String fileName, int mode):FileOutputStream 不对存储的内容进行任何的格式化处理,比较合适存储一些简单的文本数据或二进制数据SharedPreferences存储/data/data/<packagename>
/shared_prefs/Context.getSharedPreferences(String name, int mode):SharedPreferences

Activity.getPreferences(int mode):SharedPreferences

PreferenceManager.getDefaultSharedPreferences(Context context):SharedPreferences使用键值对的方式来存储数据,保存数据更加方便。数据以明文的方式保存在文件中,需要加密数据库/data/data/<packagename>/databases/SqLiteOpenHelper类、SQLiteDatabase类可以保存大量复杂的关系型数据

2、文件存储

2.1 存储数据

调用的方法:Context.openFileOutput(String fileName, int mode):FileOutputStream

其中,mode的值有两个,分别为:Context.MODE_PRIVATE和Context.MODE_APPEND

Context.MODE_PRIVATE:为默认模式,表示当指定相同文件名的时候,会覆盖原有文件。

Context.MODE_APPEND:表示文件已经存在时,会将内容追加到之前的文件中。

下面是一个例子:

 /** * 保存数据 * @param view */ public void saveData(View view){ String text = inputText.getText().toString(); if(!TextUtils.isEmpty(text)){ FileOutputStream fileOutputStream = null; BufferedWriter fileWriter = null; try{// fileOutputStream = FilePersistenceActivity.this.openFileOutput(FILENAME, Context.MODE_PRIVATE);//每次文件都是会被覆盖掉 fileOutputStream = FilePersistenceActivity.this.openFileOutput(FILENAME, Context.MODE_APPEND);//在原有文件的基础之上追加内容 fileWriter = new BufferedWriter(new OutputStreamWriter(fileOutputStream)); fileWriter.write(text); fileWriter.write("\r\n"); }catch (FileNotFoundException e){ Log.e(TAG, "saveData: 文件不存在"); }catch (IOException e){ Log.e(TAG, "saveData: IOException"+e.getMessage() ); }finally { try { if (null != fileWriter) { fileWriter.close(); } }catch (IOException e){ Log.e(TAG, "finally: IOException"+e.getMessage() ); } inputText.setText(""); } } }

2.2 读取数据

从文件中读取数据Context.openFileInput(String fileName):FileInputStream

示例代码:

 /** * 读取数据 * @param view */ public void readData(View view){ FileInputStream fileInputStream = null; BufferedReader bufferedReader = null; try { fileInputStream = FilePersistenceActivity.this.openFileInput(FILENAME); bufferedReader = new BufferedReader(new InputStreamReader(fileInputStream)); String readLine = null; StringBuffer stringBuffer = new StringBuffer(); while (!TextUtils.isEmpty(readLine = bufferedReader.readLine())){ stringBuffer.append("\r\n"); stringBuffer.append(readLine); } inputtedText.setText(stringBuffer.toString()); }catch (FileNotFoundException e){ Log.e(TAG, "readData:" +e.getMessage()); }catch (IOException e){ Log.e(TAG, "IOException:" +e.getMessage()); }finally { try { if(null != bufferedReader){ bufferedReader.close(); } }catch (IOException e){ Log.e(TAG, "IOException:" +e.getMessage()); } } }

3、SharedPreferences

3.1 三种不同的实现方式对比

在这个程序中,对应的包名为:

三种不同的实现方式对比

实现方式方法解析保存的文件名
Context.getSharedPreferences(String name, int mode)
:SharedPreferencesname:SharedPreferences文件的名称.

mode:目前只有MODE_PRIVATE这一种模式,是默认操作,表示只有当前的程序才可以对此SharedPreference进行操作

name所定义的名字

Activity.getPreferences(int mode):SharedPreferences 当前活动的类名作为文件名


PreferenceManager.getDefaultSharedPreferences(Context context):SharedPreferences 当前应用程序包名作为前缀

3.2 保存数据

调用SharedPreferences.Editor类,使用putXXX()方法,然后调用SharedPreferences.Editor的apply()即可。具体使用哪一个put方法,根据数据类型来决定。

3.3 读取数据

直接调用SharedPreferences类的getXXX()方法。具体调用哪一个get方法,根据数据类型来决定。

4、数据库

Android主要使用Sqlite数据库作为系统默认数据库。

4.1 主要涉及到的类

主要涉及到SQLiteOpenHelper和SQLiteDatabase这两个类。SQLiteOpenHelper是一个接口,主要负责数据库的创建和升级。SQLiteDatabase类主要负责执行对应的sql语句。

SQLiteOpenHelper接口有onCreate(SQLiteDatabase db)和onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)这两个方法需要重写,onCreate方法在数据库初次被创建时调用。onUpgrade方法,在传入的newVersion参数发生改变的时候,进行调用。newVersion参数,在SQLiteOpenHelper的构造方法中传入。

其中SQLiteDatabase可以通过SQLiteOpenHelper类的getWritableDatabase()和getReadableDatabase()这两个方法获得。当数据库不可以写入的时候,调用getWritableDatabase()会出现异常。调用这两个方法的过程中,会创建或者打开已有的数据库文件。

4.2 执行增删改查所对应的方法

对于数据库的增加、修改、和删除操作都可以直接调用execSQL方法,但是查询就需要调用rawQuery方法。

具体事例如下:

sqLiteDatabase.exeSql("delete from book where name = ?",new String[]{"java"});sqLiteDatabase.exeSql("update book set price = ? where name = ?",new String[]{"123","java"});sqLiteDatabase.exeSql("insert into book(name,author,price)values(?,?,?);",new String[]{"java","cxy","23.56"});Cursor cursor = sqLiteDatabase.rawQuery("select * from book",null);

4.3 数据库中主要的数据类型

integer表示整形,real表示浮点型,text表示文本类型,blob表示二进制类型。