android 数据存储

2,013 阅读6分钟

Android的数据存储

Android为用户的本地数据存储提供了多种方式,用户可以根据具体的需求选择合适的存储方式,将数据保存到各种存储介质上。本地数据的存储方式包括SharedPreferences、SD卡存储和SQLite数据库存储。

android的数据三种存储方式:

  1. SharedPreferences存储
  2. 文件存储
  3. SQLite存储

SharedPreferences存储

SharedPreferences存储的应用场景

SharedPreferences存储是Android系统中最容易使用的存储技术,是一种轻量型的Android数据存储方案,主要用于保存应用程序的一些配置信息,如登录的用户信息、播放音乐退出时的状态、设置选项等。

SharedPreferences将一些简单数据类型的数据,心键值对的形式保存在应用程序的私有Preferences目录中。SharedPreferences对象本身只能获取数据,数据的存储和修改只能通过SharedPreferences内部接口Editor来实现。

SharedPreferences的使用方法

1.获取SharedPreferences对象有两种方式:

  1. 使用PreferenceManager.getDefaultSharedPreferences()方法获取;
  2. 使用Activity的getSharedPreferences(String name,int mode)方法获取,它的第一个参数是文件名称,第二个参数是访问模式。

例如:

  SharedPreferences pref =
  PreferenceManager.getDefaultSharedPreferences(MainActivity.this);
  SharedPreferences pref =
  getSharedPreferences("mypref",Activity.MODE_PRIVATE);

1.1 getDefaultSharedPreferences()和getSharedPreferences()的区别:

  1. 自定义的一些设置通过文件名用getSharedPreferences()方法获取;
  2. 应用默认的偏好文件preferences.xml通过getDefaultSharedPreferences()方法获取。

1.2 SharedPreferences支持以下访问模式:

  1. MODE_PRIVATE:私有,代表该文件是私有数据只能被应用程序本身访问,在该模式下,写入的内容会覆盖原文件的内容。
  2. MODE_APPEND:该模式会检查文件是否存在,存在就向文件中追加内容,否则创建新文件。
  3. MODE_WORLD_READABLE:全局读,创建程序有读取或写入的权限,其他程序也有读取的权限,但不能写入。
  4. 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的注意事项:

  1. 通过edit()获取一个新的编辑器对象进行写入,设置完成后必须调用commit()方法才能写入磁盘文件,否则重启应用后,数据就会丢失。
  2. 必须使用局部变量保存获取到的edit()编辑器对象,而不能每项都通过edit()方法进行操作,因为每次调用edit()方法都会生成新的对象实例,操作的将还是同一个对象。
  3. 读取已存储的数据是通过SharedPreferences对象本身获取的,而不再是editor对象。获取数据时必须指定默认值。

文件存储

SharedPreferences只能存储一些简单的数据,而android应用程序在使用过程中,可能需要使用SD卡中的照片、视频等文件,因此文件存储的应用比较广泛。

Android的文件系统分为两类

1. 内部存储

内部存储的文件在预设的情况下只有应用程序可以使用。内部存储的文件保存在/data/data/< package name>/files目录中,应避免直接使用绝对路径,android提供了相应的API获取内部存储设备的路径。

  1. getFilesDir():返回应用程序在内部存储设备中的路径。
  2. getCacheDir():返回应用程序在内部存储设备中的缓存文件路径。
  3. Context类提供了文件和目录管理的方法:

1.1 从内部存储中创建并写入一个私有文件的步骤如下:

  1. 调用openFileOutput()方法,返回一个FileOutputStream对象。
  2. 使用write()方法将数据写入文件。
  3. 使用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 从内部存储中读取一个文件的步骤如下:

  1. 创建输入流。
  2. 使用read()方法读取文件的内容。
  3. 使用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种数据类型。

2. Android中SQLite的使用

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

其中,openDatabase()方法中的path表示数据库文件名,传入的CursorFactory对象用于构造查询时返回的Cursor对象,也可以传入null使用默认的factory构造,参数flags为打开模式,包括以下几种。

  1. OPEN_READWRITE:可读写方式。
  2. OPEN_READONLY:只读方式。
  3. CREATE_IF_NECESSARY:当数据库文件不存在时,创建该数据库。
  4. NO_LOCALIZED_COLLATORS:打开数据库时,不根据本地化语言对数据进行排序,可以使用以上四个参数中的一个或多个。

3. SQLiteOpenHelper

SQLiteOpenHelper类是SQLiteDatabase的一个辅助类。这个类主要作用是生成一个数据库,并对数据库的版本进行管理。当在程序中调用这个类的方法getWritableDatabase()或者getReadableDatabase()方法的时候,如果当时没有数据,那么android系统会自动生成一个数据库。SQLiteOpenHelper类是一个抽象类,通常需要继承它并且实现其中的2个方法。

  1. 在数据库第一次生成的时候,系统会调用以下方法。
onCreate(SQLiteDatabase)
  1. 当数据库需要升级的时候,系统会调用以下方法。
onUpgrade(SQLiteDatabase,int,int)