美文网首页
Android 详解数据持久化技术

Android 详解数据持久化技术

作者: _好好学习 | 来源:发表于2019-08-01 08:57 被阅读0次

    瞬时数据是指那些存储在内存当中,有可能会因为程序关闭或其他原因导致内存被回收而丢失的数据;数据持久化是指将那些内存中的瞬时数据保存到存储设备中,保证即使在手机或电脑关机的情况下,这些数据仍然不会丢失。持久化技术则提供了一种机制可以让数据在顺势状态和持久状态之间进行转换。
    Android系统中主要提供了3种方式用于简单地实现数据持久化功能,即文件存储、SharedPreference存储以及数据库存储,还可以将数据存储到手机的SD卡中。

    文件存储

    文件存储是Android中最基本的一种数据存储方式,它不对存储的内容进行任何的格式化处理(数据原封不动),所以比较适合存储一些简单的文本数据或二进制数据。

    将数据存储到文本中

    Context类中提供了一个openFileOutput()方法,可以用于将数据存储到指定的文本中。这个方法接受两个参数,第一个参数是文件名,在文本创建的时候使用的就是这个名称,注意这里指定的文件名不可以包含路径(因为默认存储到/data/data/<packagename>/files/目录下);第二个参数是文件的操作模式,主要有两种:1. MODE_PRIVATE:默认的操作模式,表示当指定同样文件名的时候,所写入的内容会覆盖原文中的内容 2. MODE_APPEND:表示该文件如果已存在就往文件里面追加内容。 openFileOutput()方法返回的是一个FileOutputStream对象,得到这个对象后就可以使用Java流的方式将数据写入到文件中了。
    示例代码:

    public void save(String text) {
       FileOutputStream out = null; BufferedWriter writer = null;
       try {
           out = openFileOutput("data", Context.MODE_PRIVATE); 
           writer = new BufferedWriter(new OutputStreamWriter(out)); 
           writer.write(text); 
        } catch (IOException e) { 
           e.printStackTrace(); 
       } finally { 
            try { 
                if(writer != null) writer.close(); 
            } catch (IOException e) { 
                    e.printStackTrace(); 
            } 
        } 
    } 
    

    查看数据:Tools->Android->Android Device Monitor->File Explorer找到文件目录找到文件

    从文件中读取数据

    类似地,Context类中还提供了一个openFileInput()方法,用于从文件中读取数据。这个方法的使用要比openFileOutput()简单一些,它只接受一个参数,即要读取的文件名,然后系统会自动到/data/data/<packagename>/files/目录下去加载这个文件,并返回一个FileInputStream对象,得到这个对象以后再通过Java流的方式就可以将数据读取出来了。
    示例代码:

    public String load() {
        FileInputStream in = null; 
       BufferedReader reader = null; 
        StringBuilder content = new StringBuilder(); 
        try{ 
            in = openFileInput("data"); 
            reader = new BufferedReader(new InputStreamReader(in)); 
            String line = "";
            while((line = reader.readLine()) != null) { 
                content.append(line); 
            } 
        } catch (IOException e) { 
            e.printStackTrace(); 
        } finally { 
            if (reader != null) { 
                try{ 
                   reader.close(); 
                 } catch (IOException e) {
                   e.printStackTrace();
                 } 
            } 
        } 
    return content.toString(); 
    } 
    

    SharedPreferences存储

    SharedPreferences是使用键值对的方式来存储数据的,当保存一条数据的时候,需要给这条数据提供一个对应的键,在读取的时候可以通过键把对应的值取出来。支持多种不同类型的数据类型存储。

    将数据存储到SharedPreferences中

    要想使用SharedPreferences来存储数据,首先需要获取到SharedPreferences对象。Android中主要提供了三种方式用于得到SharedPreferences对象。

    1. Context类中的getSharedPreferences()方法:此方法接受两个参数,第一个参数用于指定SharedPreferences文件的名称,如果指定的文件不存在则会创建一个,SharedPreferences文件都是存放在/data/data/<package name>/shared_prefs/目录下的;第二个参数用于指定操作模式,目前只有一个MODE_PRIVATE着一种模式可选,表示只有当前的应用程序才可以对这个SharedPreferences文件进行读写。
    2. Activity类中的getPreferences()方法:只接受一个操作模式参数,因为使用这个方法时会自动将当前活动的类名作为SharedPreferences的文件名。
    3. PreferenceManager类中的getDafaultSharedPreferences()方法:接受一个Context参数,并自动使用当前应用程序的包名作为前缀来命名SharedPreferences文件。

    得到了SharedPreferences对象,就可以开始向SharedPreferences文件中存储数据了,主要分三步实现:

    1. 调用SharedPreferences对象的edit()方法来获取一个SharedPreferences.Editor对象
    2. 向SharedPreferences.Editor对象中添加数据,如添加一个字符串使用putString()方法
    3. 调用apply()方法将添加的数据提交,完成数据的存储操作 示例代码:
    public void save() { 
       SharePreferences.Editor editor = getSharedPreferences("data", MODE_PRIVATE).edit();                 editor.putString("key", "value"); 
       editor.putInt("num",666); 
       editor.apply(); 
    } 
    
    

    路径同上,会生成一个data.xml文件

    从SharedPreferences中读取数据

    SharedPreferences对象中提供了一系列的get方法,用于读取存储的数据,每种get方法都对应着put方法。这些get方法都接受两个参数,第一个参数是键,第二个参数是默认值,表示传入的键找不到对应的值时会以什么样的默认值返回。
    示例代码:

    public void load() { 
           SharedPreferences pref = getSharedPreferences("data", MODE_PRIVATE); 
           String value = pref.getString("key",""); 
           int num = pref.getInt("num", 0);
    } 
    

    SQLite数据库存储 (CURD操作)

    Android系统是内置了数据库的。SQLite是一款轻量级的关系型数据库,它的运算速度非常快,占用资源很少(通常只要几百kb的内存),SQLite不仅支持标准的SQL语法,还遵循了数据库的ACID事务

    创建数据库

    Android专门提供了一个SQLiteOpenHelper帮助类,借助这个类就可以非常简单地对数据库进行创建和升级。

    SQLiteOpenHelper类是一个抽象类,有两个抽象方法,分别是onCreate()与onUpgrade(),意味着需要写一个类来继承SQLiteOpenHelper类并重写这两个方法,分别在这两个方法中去实现创建、升级数据库的逻辑。

    SQLiteOpenHelper类中还有两个非常重要的实例方法:getReadableDatabase()和getWritableDatabase()。这两个方法都可以创建或打开一个现有的数据库,并返回一个可对数据库进行读写操作的对象。不同的是,当数据库不可写入的时候,getReadableDatabase()方法返回的对象将以只读的方式去打开数据库,而getWritableDatabase()方法则将出现异常。

    SQLiteOpenHelper有两个构造方法可供重写。(在这详述只有四个参数的那个)第一个参数是Context,第二个参数是数据库名,第三个参数允许我们在查询的时候返回一个自定义的Cursor,一般传入null,第四个参数表示当前数据库的版本号,可用于对数据库进行升级操作。

    构建出SQLiteOpenHelper的实例后在调用它的getReadableDatabase()或getWritableDatabase()方法就能够创建数据库了。数据库文件会存放在/data/dsata/<package name>/database/目录下。此时重写的onCreate()方法也会得到执行,所以通常会在这里去处理一些创建表的逻辑。

    SQLite都数据类型很简单,integer表示整型,real表示浮点型,text表示文本类型,blob表示二进制类型。primary key表示主键,autoincrement关键字表示自增。
    建表示例:

    final String CREATE_TABLE = "create table Book (
       id integer primary key autoincrement,
       author text,
       price real,
       pages integer,
       name text)";
    onCreate(SQLite db) {
       db.execSQL(CREATE_TABLE);   //执行建表语句
    }
    onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion){}
    
    升级数据库

    注意:如果onCreate()方法中的执行建表语句中有的数据库已经存在,则该onCreate()方法不会被执行,通常的解决方法是在onUpgrade()方法中判断,如果已存在则drop,再调用onCreate()方法以达到更新数据库的目的。

    添加数据

    Android提供了一系列的辅助性方法,使得在Android中即使不去编写SQL语句也能完成CRUD操作。

    SQLiteOpenHelper的getReadableDatabase()或getWritableDatabase()方法不仅可以用于创建和升级数据库,还会返回一个SQLiteDatabase对象,借助这个对象就可以对数据进行CRUD操作。

    SQLiteDatabase中提供了一个insert()方法,这个方法专门用于添加数据。该方法接受三个参数,第一个参数是表名,第二个参数用于在未指定添加数据的情况下给某些可为空的列自动赋值NULL,一般直接传入null即可,第三个参数是一个ContentValues对象,它提供了一系列的put()方法重载,用于向ContentValues中添加数据,只需要将表中的每个列名以及相应的带添加数据传入即可。

    更新数据

    SQLiteDatabase提供了一个update()方法用于对数据进行更新,该方法接受4个参数,第一个参数是表名,第二个参数是ContentValues对象,第三、第四个参数用于约束更新某一行或某几行的数据,不指定的话就是更新所有行。

    删除数据

    SQLiteDatabase提供了一个update()方法用于删除数据,该方法接受3个参数,第一个是表名,第二、第三个参数用于约束删除某一行或某几行的数据,不指定的话就是删除所有行。

    查询数据

    SQLiteDatabase提供了一个query()方法用于查询数据,使用复杂。

    LitePal使用讲解

    配置LitePal
    compile 'org.litepal.android:core:1.4.1'
    创建和升级数据库
    使用LitePal添加数据
    更新数据
    删除数据
    查询数据

    郭霖技术博客系列:

    Android数据库高手秘籍(零)——前言
    Android数据库高手秘籍(一)——SQLite命令
    Android数据库高手秘籍(二)——创建表和LitePal的基本用法
    Android数据库高手秘籍(三)——使用LitePal升级表
    Android数据库高手秘籍(四)——使用LitePal建立表关联
    Android数据库高手秘籍(五)——LitePal的存储操作
    Android数据库高手秘籍(六)——LitePal的修改和删除操作
    Android数据库高手秘籍(七)——体验LitePal的查询艺术
    Android数据库高手秘籍(八)——使用LitePal的聚合函数
    Android数据库高手秘籍(九),赶快使用LitePal 2.0版本吧

    相关文章

      网友评论

          本文标题:Android 详解数据持久化技术

          本文链接:https://www.haomeiwen.com/subject/aamfdctx.html