目录
第七章
7.1、持久化技术
3种实现数据持久化功能:文件存储、SharedPreferences存储以及数据库存储
7.2、文件存储
7.2.1、将数据存储到文件中
使用Context类提供的openFileOutput()方法,openFileOutput()方法接收两个参数:第一个参数是文件名;第二个参数是文件的操作模式,主要有有MODE_PRIVATE和MODE_APPEND两种模式可选。默认为MODE_PRIVATE,表示当前指定相同文件名的时候,所写入的内容将会覆盖原文件的内容。
// 数据存储到文件中
fun save(inputText: String) {
try {
val output = openFileOutput("data", Context.MODE_PRIVATE)
val writer = BufferedWriter(OutputStreamWriter(output))
// 使用use扩展函数在lambda表达式中的代码全部执行完之后自动将外层的流关闭
writer.use {
it.write(inputText)
}
} catch (e: IOException) {
e.printStackTrace()
}
}
7.2.2、从文件中读取数据
使用Context类提供的openFileOutput()方法,openFileOutput()方法只接受一个参数,即要读取的文件名。
// 从文件中读取数据
fun load(): String {
val content = StringBuilder()
try {
val input = openFileInput("data")
val reader = BufferedReader(InputStreamReader(input))
reader.use {
// forEachLine为内置函数,将读到的每行内容都回调到lambda表达式中
reader.forEachLine {
content.append(it)
}
}
} catch (e: IOException) {
e.printStackTrace()
}
}
7.3、SharedPreferences存储
sharedPreferences使用键值对的方式存储数据。
7.3.1、将数据存储到sharedPreferences
将数据存储到sharedPreferences需要先获取sharedPreferences对象,主要有两种方法获取sharedPreferences对象:
1、Context类中的getSharedPreferences()方法
Contetx中的getSharedPreferences()方法接收两个参数,第一个参数用于指定SharedPreferences文件的名称,如果指定的文件不存在则会创建一个,SharedPreferences文件的存放路径为:/data/data/<package name>/shared_prefs/目录下;第二个参数用于指定操作模式,目前只有默认的MODE_PRIVATE这一模式可选。
2、 Activity类中的getPreferences()方法
Activity类中的getPreferences()方法接收一个参数。
得到sharedPreferences对象后分3步实现先sharedPreferences文件中存储数据:
(1)调用sharedPreferences对象的edit()方法获取一个sharedPreferences.Editor()对象;
(2)向sharedPreferences.Editor()中添加数据
(3)调用apply()方法将添加的数据提交
// 将数据存储到SharedPreferences中
fun saveToSharedPreferences(context: Context, key: String, value: Any) {
val sharedPreferences = context.getSharedPreferences("my_preferences", Context.MODE_PRIVATE)
val editor = sharedPreferences.edit()
when (value) {
is String -> editor.putString(key, value)
is Int -> editor.putInt(key, value)
is Boolean -> editor.putBoolean(key, value)
is Float -> editor.putFloat(key, value)
is Long -> editor.putLong(key, value)
}
editor.apply()
}
7.3.2、从sharedPreferences中读取数据
根据put的类型使用相对应的get方法(例:布尔类型为getBoolean();String为getString()),每个get方法都接收两个参数:第一个参数是键,第二个参数是默认值,表示当传入的键找不到对应的值时会以什么样的默认值进行返回。
//从sharedPreferences中读取数据
fun getFromSharedPreferences(context: Context, key: String, defaultValue: Any): Any {
// 通过getSharedPreferences得到sharedPreferences对象
val sharedPreferences = context.getSharedPreferences("my_preferences", Context.MODE_PRIVATE)
// 分别调用对应的get()方法
return when (defaultValue) {
is String -> sharedPreferences.getString(key, defaultValue) ?: ""
is Int -> sharedPreferences.getInt(key, defaultValue)
is Boolean -> sharedPreferences.getBoolean(key, defaultValue)
is Float -> sharedPreferences.getFloat(key, defaultValue)
is Long -> sharedPreferences.getLong(key, defaultValue)
else -> throw IllegalArgumentException("Unsupported data type")
}
}
7.4、SQLite数据库存储
SQLiteOpenHelper为抽象类,SQLiteOpenHelper中有两个抽象方法:onCreate()和 onUpgrade()。两个实例方法:getReadableDatabase()和 getWritableDatabase()。两个构造方法可重写。
1、创建数据库
create table Book (
//使用primary key将id设置为主键,autoincrement表示id列是自增长
id integer primary key autoincrement,
author text,
price real,
pages integer,
name text)
2、onUpgrade()方法用于进行数据库升级
3、insert()方法用于添加数据
4、update()方法用于更新数据
5、delete()方法用于删除数据
6、query()用于查询数据
使用SQL操作数据库
(1)添加数据:
db.execSQL("insert into Book (name, author, pages, price) values(?, ?, ?, ?)",
arrayOf("The Lost Symbol", "Dan Brown", "510", "19.95")
)
(2)更新数据
db.execSQL("update Book set price = ? where name = ?", arrayOf("10.99", "The Da Vinci Code"))
(3)删除数据
db.execSQL("delete from Book where pages > ?", arrayOf("500"))
(4)查询数据
val cursor = db.rawQuery("select * from Book", null)
7.5、使用高阶函数简化SharedPrefreces的用法
使用SharedPreferences存储数据(简化前):
val editor = getSharedPreferences("data", Context.MODE_PRIVATE).edit()
editor.putString("name", "Tom")
editor.putInt("age", 28)
editor.putBoolean("married", false)
editor.apply()
简化后:
fun SharedPreferences.open(block: SharedPreferences.Editor.() -> Unit) {
val editor = edit()
editor.block()
editor.apply()
}
// 调用
getSharedPreferences("data", Context.MODE_PRIVATE).open {
putString("name", "Tom")
putInt("age", 28)
putBoolean("married", false)
}