从零开始学安卓(kotlin)六——数据持久化

从零开始学安卓(kotlin)六——数据持久化,第1张

目录
  • SharedPreferences存储
    • 将数据存储到SharedPreferences中
    • 从SharedPreferences中读取数据
    • 应用记住密码
  • SQLite数据库存储
    • 事务
  • Room

SharedPreferences存储

SharedPreferences是使用键值对的方式来存储数据的。也就是说, 当保存一条数据的时候,需要给这条数据提供一个对应的键,这样在读取数据的时候就可以通 过这个键把相应的值取出来。而且SharedPreferences还支持多种不同的数据类型存储,如果 存储的数据类型是整型,那么读取出来的数据也是整型的;如果存储的数据是一个字符串,那 么读取出来的数据仍然是字符串。

将数据存储到SharedPreferences中

通过 getSharedPreferences()方法指定SharedPreferences的文件名为data,并得到了 SharedPreferences.Editor对象。接着向这个对象中添加了3条不同类型的数据,最 后调用apply()方法进行提交,从而完成了数据存储的 *** 作

val editor = getSharedPreferences("data", Context.MODE_PRIVATE).edit()
editor.putString("name", "Tom")
editor.putInt("age", 28)
editor.putBoolean("married", false)
editor.apply()
从SharedPreferences中读取数据

从SharedPreferences文件中读取数据会更加简单。SharedPreferences对象中 提供了一系列的get方法,用于读取存储的数据,每种get方法都对应了 SharedPreferences.Editor中的一种put方法,比如读取一个布尔型数据就使用 getBoolean()方法,读取一个字符串就使用getString()方法。这些get方法都接收两个参 数:第一个参数是键,传入存储数据时使用的键就可以得到相应的值了;第二个参数是默认 值,即表示当传入的键找不到对应的值时会以什么样的默认值进行返回。
分别调用它的getString()、getInt()和 getBoolean()方法,去获取前面所存储的姓名、年龄和是否已婚,如果没有找到相应的值, 就会使用方法中传入的默认值来代替

val prefs = getSharedPreferences("data", Context.MODE_PRIVATE)
val name = prefs.getString("name", "")
val age = prefs.getInt("age", 0)
val married = prefs.getBoolean("married", false)
应用记住密码

可以看到,这里首先在onCreate()方法中获取了SharedPreferences对象,然后调用它的 getBoolean()方法去获取remember_password这个键对应的值。一开始当然不存在对应的 值了,所以会使用默认值false,这样就什么都不会发生。接着在登录成功之后,会调用 CheckBox的isChecked()方法来检查复选框是否被选中。如果被选中了,则表示用户想要记 住密码,这时将remember_password设置为true,然后把account和password对应的值都 存入SharedPreferences文件中并提交;如果没有被选中,就简单地调用一下clear()方法, 将SharedPreferences文件中的数据全部清除掉。
当用户选中了记住密码复选框,并成功登录一次之后,remember_password键对应的值就是 true了,这个时候如果重新启动登录界面,就会从SharedPreferences文件中将保存的账号和 密码都读取出来,并填充到文本输入框中,然后把记住密码复选框选中,这样就完成记住密码 的功能了。

val prefs = getPreferences(Context.MODE_PRIVATE)
val isRemember = prefs.getBoolean("remember_password", false)
if (isRemember) {
	// 将账号和密码都设置到文本框中
	val account = prefs.getString("account", "") 
	val password = prefs.getString("password", "") 		
	accountEdit.setText(account) 	
	passwordEdit.setText(password) 
	rememberPass.isChecked = true
}
login.setOnClickListener {
	val account = accountEdit.text.toString()
	val password = passwordEdit.text.toString()
	// 如果账号是admin且密码是123456,就认为登录成功
	if (account == "admin" && password == "123456") {
		val editor = prefs.edit()
		if (rememberPass.isChecked) { // 检查复选框是否被选中
            editor.putBoolean("remember_password", true)
            editor.putString("account", account)
            editor.putString("password", password)
        } else {
            editor.clear()
        }
        editor.apply()
        val intent = Intent(this, MainActivity::class.java)
        startActivity(intent)
        finish()
    } else {
        Toast.makeText(this, "account or password is invalid", Toast.LENGTH_SHORT).show()}

SQLite数据库存储

添加数据:

db.execSQL("insert into Book (name, author, pages, price) values(?, ?, ?, ?)",arrayOf("The Da Vinci Code", "Dan Brown", "454", "16.96"))
db.execSQL("insert into Book (name, author, pages, price) values(?, ?, ?, ?)",arrayOf("The Lost Symbol", "Dan Brown", "510", "19.95"))

更新数据:

db.execSQL("update Book set price = ? where name = ?", arrayOf("10.99", "The Da Vinci Code"))

删除数据:

db.execSQL("delete from Book where pages > ?", arrayOf("500"))

查询数据:

val cursor = db.rawQuery("select * from Book", null)
事务

Android中事务的标准用法,首先调用SQLiteDatabase的 beginTransaction()方法开启一个事务,然后在一个异常捕获的代码块中执行具体的数据库 *** 作,当所有的 *** 作都完成之后,调用setTransactionSuccessful()表示事务已经执行成 功了,最后在finally代码块中调用endTransaction()结束事务。注意观察,我们在删除旧 数据的 *** 作完成后手动抛出了一个NullPointerException,这样添加新数据的代码就执行 不到了。不过由于事务的存在,中途出现异常会导致事务的失败,此时旧数据应该是删除不掉 的。

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

Google又推出了一个专门用于Android平台的数据库框架——Room。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://www.outofmemory.cn/langs/724239.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-26
下一篇 2022-04-26

发表评论

登录后才能评论

评论列表(0条)

保存