《第一行代码》第七章 数据存储全方案 详解持久化技术

  • 本篇参考资料《第一行代码 第三版》 2020.4月出版
  • 本篇文章只是本人看书的理解和整理的笔记,更完整的内容还在书上
  • 尊重原作者 请购买正版图书

第六章涉及到四大组件中的广播接收者和广播发送者,目前使用率较低,先看第七章的SQLite和其他持久化存储吧,这个比较重要。

关于持久化存储三种方式,在实际项目操作中肯定是需要进行封装的,一般会采用单例模式。这部分只简单理解基本的使用方法,毕竟再高级的封装都是从基础开始的。学习完毕后可以自己尝试进行封装或者去参考比较成熟的封装方法。总之,最适合自己的就是最好的。

一 文件操作

最简单的文件读写,这里保存一个输入框的字符串,在启动activity的时候读取并填写到输入框

    fun save(input: String) {
        val output = openFileOutput("data", Context.MODE_PRIVATE)
        val writer = BufferedWriter(OutputStreamWriter(output))
        writer.use {
            it.write(input)
        }
    }

    fun read() {
        val content = StringBuilder()
        val input = openFileInput("data")
        val reader = BufferedReader(InputStreamReader(input))
        reader.use {
            it.forEachLine {
                content.append(it)
            }
        }
        editText.setText(content.toString())
    }

这只是最简单的APP内部文件操作例子,我这里想补充一下,首先Android上的文件读写分为两大类型:APP内部和APP外部(SD卡)

APP内部文件读写

不需要请求权限,直接可以进行操作,内部读写分为保存目录和缓存目录
保存目录data/data/包名/files 这里可以保存一些重要文件,app卸载时会清空
缓存目录data/data/包名/cache 这里可以临时缓存一些文件,内存不足时系统会清理,app卸载时会清空

APP外部文件读写

需要请求SD卡访问权限。这里主要是app外部的文件操作,比如SD卡,访问系统相册这些操作。
在使用前需要判断是否有SD卡可以读写。比如有些设备是外置SD卡,有时候有,有时候没有。这些都是需要注意的问题。

二 SharedPreferebces单个字段存储

简单用法:

        saveBtn.setOnClickListener {
            val sp = getSharedPreferences("data", Context.MODE_PRIVATE)
            val editor = sp.edit()
            editor.putString("name", "Tom")
            editor.putInt("age", 18)
            editor.putBoolean("married", false)
            editor.apply()
            Log.d(TAG, "保存成功")

        }
        readBtn.setOnClickListener {
            val sp = getSharedPreferences("data", Context.MODE_PRIVATE)
            Log.d(TAG, sp.getString("name", ""))
            Log.d(TAG, sp.getInt("age", 0).toString())
            Log.d(TAG, sp.getBoolean("married", false).toString())
        }

注意点1:保存列表时,只能保存Set类型,Set的特点是无序
注意点2:保存对象object该怎么操作,比如数据实体类?(思路:转换为JSON字符串再保存)
注意点3:在项目中使用最好采用单例模式进行封装

三 SQLite数据库

注意:书上和以下内容都只是SQLite数据库的最基本的用法,实际项目使用中,肯定需要进行封装的!!但是要进行封装也得从基础开始,继续吧。
实际使用过程中,应该是直接传入数据实体类对象到封装的方法中进行保存。当然也会有查询数据转化为数据实体类等问题。
封装参考:https://blog.csdn.net/tywfeng/article/details/86653875

你可能感兴趣的:(《第一行代码》第七章 数据存储全方案 详解持久化技术)