android数据持久化

运维

  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_APP

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

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

   下面是一个例子:

   /** * 保存数据 * @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_APP);//在原有文件的基础之上追加内容 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.app("\r\n"); stringBuffer.app(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表示二进制类型。

标签: 运维