Android---《第一行代码》(第3版)第七章【数据存储】对比


撸《第一行代码》的第6天,打卡~今天的内容,我觉得用知识网络结构图,没有那么好记忆。所以换了个方式,将这几种存储方式对比的学习~废话不多说,直接上图。哦,不对,上表

存储方式

适用情况

原理

核心步骤/主要内容

文件存储

简单的文本数据和二进制数据

文件IO流

1.获取输入值

2.创建FileOutputstream对象(设置模式)

3.写入数据

4.关闭数据流

SharedPreferences

保存少量数据,且数据格式简单

基于XML文件存储的键值对数据

1.根据Context获取SP对象

2.利用.editor()获取Editor对象

3.通过Editor对象存储键值对数据

4.通过commit()方法提交数据

SQLite数据库方式

轻量级嵌入式数据库引擎

利用SQL语句

1.SQLiteOpenHelper是一个帮助类,用于创建和管理数据库。

2.SQLiteDatabase,用于对数据的CRUD

3.最后记得关闭IO流

内容提供器(Content provider)

在不同的应用程序之间共享数据

统一的通过Uri实现数据操作的方式

1.在当前应用程序中定义一个CP

2.在当前应用程序的清单中注册此CP

3.其他程序通过ContentResolver(提供了CRUD的对应方法)和Uri来获取CP的数据

网络

     

其中为了知识结构的完整,带上了【网络存储】这个方式,不过具体的内容没有太详细的研究,所以没写。后期补上吧。


文件存储

输出(将数据存储到文件中)

想要写到文件中,主要两个主体,一个中介。一个主体是写入的文件,一个主体是写入的内容。中间介质就是缓冲输出字符流

大概就是这个样子吧! 

输入(将数据从文件中读取到程序中)

基本就是把out改成in,把writer改为reader。过程可以理解为输出的逆向。


 SharedPreferences存储

        通过键值对实现存储

        该存储方式的使用的核心,就是拿到editor后,通过putString,putInt,putBoolean等方法,存储数据。然后最后通过apply()异步提交,或者commit()同步提交。那么如何拿到editor呢?通过getSharedPreferences("data",Context.MODE_PRIVATE).editor() 就可以获取到editor了。其中

 data是文件名,后面那个是写入模式。

    读取数据时,通过getSharedPreferences("data",Context.MODE_PRIVATE)获取要sp对象,然后通过getString,getInt等方法,填入对应的键,获取对应的值。


SQLite数据库

        创建一个类,继承SQLiteOpenHelper,重写onCreate() 和 onUpgrade()方法

       然后在需要存储数据的地方实例化该类,并调用实例的writableDatabase创建数据库,并初始化(onCreate()),这个数据库存在后,就不会在执行这个方法了。

        接下来的CRUD 就通过调用对应的方法,db.insert, db.update, db.delete(), db.query()

     使用事务

           使用事务就是为了 避免一笔钱因为异常凭空消失。

 db.beginTransaction() // 开启事务
            try {
                db.delete("Book", null, null)
                if (true) {
                    // 在这里手动抛出一个异常,让事务失败
                    throw NullPointerException()
                }
                val values = cvOf("name" to "Game of Thrones", "author" to "George Martin", "pages" to 720, "price" to 20.85)
                db.insert("Book", null, values)
                db.setTransactionSuccessful() // 事务已经执行成功
            } catch (e: Exception) {
                e.printStackTrace()
            } finally {
                db.endTransaction() // 结束事务
            }

        看一下setTransactionSuccessful() 方法实现

 public void setTransactionSuccessful() {
        throwIfNoTransaction();
        throwIfTransactionMarkedSuccessful();

        mTransactionStack.mMarkedSuccessful = true;
    }

  底层也是通过mMarkedSuccessful 这样一个标志来标记事务是否成功了。

  可以这么理解,就是在需要开启事务的逻辑前,开启一个事务,如果最后没有成功,则事务后的所有代码执行都恢复到没有执行前的状态。如果成功了(没有异常),那就。。。成功了


内容提供器是第8章的内容,明天再写笔记吧~ 今天打卡成功,每天保持一定量的输入和输出。

PS:依旧秉持着联机学习 1+1>2的原则,欢迎大家指点批评,互相交流学习~

原创文章 17 获赞 4 访问量 5182

猜你喜欢

转载自blog.csdn.net/yqq577/article/details/105539055