撸《第一行代码》的第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的原则,欢迎大家指点批评,互相交流学习~