文章目录

  • 一、文件存储
    • 1、将数据写到文件中
    • 2、从文件中读取数据
  • 二、SharedPreferences存储
    • 1、获取SharedPreferences对象
    • 2、存储数据
    • 2、读取数据
  • 三、SQLite数据库存储
    • 1、创建数据库
    • 2、升级数据库
    • 3、添加数据
    • 4、更新数据
    • 5、删除数据
    • 6、查询数据
    • 7、使用SQL语句进行增删改查
    • 8、使用事务
    • 9、升级数据库
  • 四、Kotlin课堂——高阶函数的应用
    • 1、简化SharedPreferences的用法

一、文件存储

1、将数据写到文件中

private fun save(inputText: String){try {//Context中的方法,用于将数据存储到指定的文件中,文件路径为/data/data/<package name>/files/目录下//写入方式有Context.MODE_PRIVATE和Context.MODE_APPEND两种,前者会覆盖原文件,后者是在原文件的基础上追加val output = openFileOutput("data", Context.MODE_PRIVATE)val writer = BufferedWriter(OutputStreamWriter(output))//扩展函数use可以在执行后自动将流关掉writer.use {it.write(inputText)}}catch (e: IOException){e.printStackTrace()}}

2、从文件中读取数据

//加载数据的函数private fun load(): String{val content = StringBuilder()try {val input = openFileInput("data")val reader = BufferedReader(InputStreamReader(input))reader.use {//一个内置扩展函数,读到的每一行都会返回到lambda中(it)reader.forEachLine {content.append(it)}}}catch (e: IOException){e.printStackTrace()}return content.toString()}

二、SharedPreferences存储

1、获取SharedPreferences对象

获取SharedPreferences对象有两种方式

  1. 使用Context类中的方法获取,可以指定文件名
getSharedPreferences("data", Context.MODE_PRIVATE)
  1. 使用Activity类中的方法获取,不能指定文件名
getPreferences(Context.MODE_PRIVATE)

不过都需要指定操作模式,这里只能用Context.MODE_PRIVATE,其他几种都已被废弃

2、存储数据

  1. 先获取SharedPreferences.Editor对象
val editor: SharedPreferences.Editor = getSharedPreferences("data", Context.MODE_PRIVATE).edit()
  1. 使用putInt…等方法添加数据(名值对)
editor.putString("name", "Tom")editor.putInt("age", 28)editor.putBoolean("married", false)
  1. 最后提交,完成存储
editor.apply()

2、读取数据

一看就懂

val prefs = getSharedPreferences("data", Context.MODE_PRIVATE)val name = prefs.getString("name", "")val age = prefs.getInt("age", 0)val married = prefs.getBoolean("married", false)Log.d("MainActivity", "name is $name")Log.d("MainActivity", "age is $age")Log.d("MainActivity", "married is $married")

三、SQLite数据库存储

1、创建数据库

新建数据库类MyDatabaseHelper继承SQLiteOpenHelper
在onCreate中执行SQL语句完成建表

class MyDatabaseHelper(val context: Context, name: String, version: Int): SQLiteOpenHelper(context, name, null, version) {//建表语句private val createBook = "create table book (" +"id integer primary key autoincrement," +"author text," +"price real," +"pages integer," +"name text)"//创建表可以在这里面写override fun onCreate(db: SQLiteDatabase) {//执行SQL语句db.execSQL(createBook)Toast.makeText(context, "create succeeded", Toast.LENGTH_SHORT).show()}//数据库需要更新的时候使用override fun onUpgrade(db: SQLiteDatabase?, oldVersion: Int, newVersion: Int) {}}

在主程序中建立MyDatabaseHelper对象
调用getWritableDatabase()方法:若程序中没有该数据库,就会进行创建

val dbHelper = MyDatabaseHelper(this, "BookStore.db", 1)createDatabase.setOnClickListener {dbHelper.writableDatabase}

2、升级数据库

如果我们要在数据库中添加一张新表或修改原有结构,如:

private val createCategory = "create table Category (" +"id integer primary key autoincrement," +"category_name text," +"category_code integer)"

此时必须在onUpgrade增加代码,使数据库重新创建

//数据库需要更新的时候使用override fun onUpgrade(db: SQLiteDatabase?, oldVersion: Int, newVersion: Int) {db?.execSQL("drop table if exists Book")db?.execSQL("drop table if exists Category")if (db != null) {onCreate(db)}}

并修改数据库版本号

val dbHelper = MyDatabaseHelper(this, "BookStore.db", 2)

3、添加数据

  1. 先获取writableDatabase对象
val db = dbHelper.writableDatabase
  1. 组装数据
val values1 = ContentValues().apply {//开始组装第一条数据put("name", "The Da Vinci Code")put("author", "Dan Brown")put("pages", 454)put("price", 16.96)}
  1. 插入数据
//插入数据,参数一:表面;参数二:null就行;参数三:ContentValues对象db.insert("Book", null, values1)

4、更新数据

val db = dbHelper.writableDatabase
//把要更新的数据放在ContentValues里面
val values = ContentValues()
values.put("price", 10.99)
//参数一:表名;参数二:要更新的ContentValues对象;参数三:where部分,使用?占位符;参数四:指定?的数组
db.update("Book", values, "name = ?", arrayOf("The Da Vinci Code"))

5、删除数据

val db = dbHelper.writableDatabase
//参数一:表名;参数二:where部分,使用?占位符;参数三:指定?的数组
db.delete("book", "pages > ?", arrayOf("500"))

6、查询数据

//查询所有数据val cursor = db.query("Book",null,null,null,null,null,null)if (cursor.moveToFirst()){//This method will return false if the cursor is empty.do {//遍历cursor对象,取出所有值并打印val name = cursor.getString(cursor.getColumnIndex("name"))//getColumnIndex获取某一列在表中对应的位置索引val author = cursor.getString(cursor.getColumnIndex("author"))val pages = cursor.getInt(cursor.getColumnIndex("pages"))val price = cursor.getDouble(cursor.getColumnIndex("price"))Log.d("MainActivity", "book name is $name")Log.d("MainActivity", "book author is $author")Log.d("MainActivity", "book pages is $pages")Log.d("MainActivity", "book price is $price")}while (cursor.moveToNext())//向下一个位置移动}cursor.close()//最后别忘了关闭cursor

其中,query()的七个参数如下:

7、使用SQL语句进行增删改查

添加数据的方法如下:

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

更新数据的方法如下:

db.execSQL("update Book set price = ? where name = ?", new String[] { "10.99", "The Da Vinci Code" });

删除数据的方法如下:

db.execSQL("delete from Book where pages > ?", new String[] { "500" });

查询数据的方法如下:

db.rawQuery("select * from Book", null);

8、使用事务

val db = dbHelper.writableDatabase//事务的标准写法//先开启事务db.beginTransaction()try {//在try中执行逻辑代码,如果中途出现异常,则这个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()//结束事务}

9、升级数据库

如果我们添加了新的字段或者表后,想要在升级数据库的同时保存原有数据,可以在onUpgrade()方法中进行数据库版本的判断,并做相应的特殊处理

if(oldVersion <= 2){db?.execSQL(createCategory)}if(oldVersion <= 3){db?.execSQL("alter table Book add column category_id integer")}

四、Kotlin课堂——高阶函数的应用

1、简化SharedPreferences的用法

由于扩展库KTX,我们可以直接这样

getSharedPreferences("data", Context.MODE_PRIVATE).edit {putString("name", "Tom")putBoolean("married", false)}

即可完成整个getSharedPreferences的数据添加

这个简便方法的原理可以自己实现一下

在SharedPreferences中添加open高阶函数,接受SharedPreferences.Editor的函数类型参数(也就是说,接受SharedPreferences.Editor类的成员方法,如putString())

import android.content.SharedPreferencesfun SharedPreferences.open(block: SharedPreferences.Editor.() -> Unit){val editor = edit()editor.block()editor.apply()
}

如此,便可以这样使用

//之后就可以这样存储数据getSharedPreferences("data", Context.MODE_PRIVATE).open {putString("name", "Tom")putBoolean("married", false)}

效仿这种做法,我们可以创建自己的高阶函数对已知类进行扩展,方便我们的开发使用

第一行代码Android个人笔记(五)——文件存储相关推荐

  1. 第一行代码 Android读书笔记(二)

    第一行代码 Android读书笔记 第三章 软件也要拼脸蛋-UI开发的点点滴滴 常用控件的使用方法 详解4种基本布局 自定义控件 最常用和最难用的控件-ListView 更加强大的滚动控件-Recyc ...

  2. 《第一行代码Android》笔记

    第1章 开始启程,你的第一行Android代码 1.1 了解全貌,Android王国简介 Android系统是基于Linux 2.6内核的,这一层为Android设备的各种硬件提供了底层的驱动,如显示 ...

  3. Android第一行代码学习思考笔记(碎片、广播、持久化技术和Android数据库)

    Android第一行代码学习思考笔记(碎片.广播.持久化技术和Android数据库 第四章 手机平板要兼顾--探究碎片 4.1碎片是什么(Fragment) 4.2碎片的使用方式 4.2.1碎片的简单 ...

  4. 第一行代码Android第二章读书笔记

    第一行代码Android第二章读书笔记 Activity 1.1 手动创建活动 1.2 Toast和Menu/销毁活动 Intent 2.1 显示/隐式 2.2 传递/返回数据 活动的生命周期 3.1 ...

  5. 第一行代码android的读后感,《第一行代码Android》读书笔记

    自学android一段时间了,一开始是看看视频,跟着打打代码,后来也有跟着团队一起做项目,一直都很零散,并没有真正系统的学习过,虽然能跟得上项目,但总觉得基础不牢固扎实,之前有读过郭霖老师博客里的几篇 ...

  6. 《第一行代码Android》读书笔记

    自学android一段时间了,一开始是看看视频,跟着打打代码,后来也有跟着团队一起做项目,一直都很零散,并没有真正系统的学习过,虽然能跟得上项目,但总觉得基础不牢固扎实,之前有读过郭霖老师博客里的几篇 ...

  7. 《第一行代码》读书笔记(七):album爬坑

    <第一行代码>读书笔记(七):album爬坑 权限问题 尽管书中提到4.4系统之前需要声明访问SD卡权限,不过很遗憾,4.4系统之后仍然需要 照片不显示问题 Android10对文件访问权 ...

  8. 《第一行代码 Android 第2版》下载

    <第一行代码 Android 第2版> https://pan.baidu.com/s/1B718h7h3601iEe8gIN9oAQ

  9. 晒订单赢图灵图书,《第一行代码——Android》福利活动劲爆来袭!

    (已结束) 我的著作<第一行代码--Android>已经预售几天了,这段时间也有不少朋友早早地就订购了这本书,感谢大家对我一如既往的支持,在离发货还有十几天的时候就预订了这本书. 为了特别 ...

最新文章

  1. C++:Lambda函数学习
  2. 夺命雷公狗---linux NO:3 centos_mini版的安装和备份
  3. golang导入git包_使用go module导入本地包的方法教程详解
  4. linux命令 pushd和popd
  5. iTween基础之Color(变换颜色)
  6. OSChina 周一乱弹 ——节后突然不想上班的节奏
  7. 一个类可以实现多个接口吗_java中接口的概念
  8. shell命令-if语句
  9. 记一次线上coredump事故
  10. Nginx前端设置反向代理,后端Apache如何获取访客的真实IP,结合PHP
  11. RabbitMQ基础知识详解
  12. 【Windows】操作系统原理
  13. 23个适合logo设计的常用英文字体
  14. 智慧树知到等各大网课搜题接口及搜题公众号搭建教程
  15. 量子计算机平行宇宙,【宇宙探秘】量子永生?量子纠缠可以推断出平行宇宙,再无真正意义上的死亡?...
  16. 杂谈|程序员还是工程师
  17. AFM(弹性模量)—文献专项阅读
  18. IntelliJ IDEA默认的keymap设置是哪个?
  19. 获取textarea标签中的换行符和空格
  20. 分享tushare量化接口获取港股列表信息的代码

热门文章

  1. 07组第二次作业 深度学习和pytorch基础
  2. 记一次git冲突解决
  3. 如何在服务器上添加虚拟IP?看完原来如此简单
  4. 加速信创落地,最新国产身份目录服务首发
  5. 凸函数二阶条件的理解及常见函数解析
  6. CSS 字体大小 font-size属性
  7. Python实验,用pygame做飞机大战游戏设计
  8. domoticz添加和风天气,让domoticz显示天气信息
  9. 出现leaked ServiceConnection 的解决办法
  10. tunel凋亡试剂盒说明书_QIA33 TUNEL显色法细胞凋亡检测试剂盒使用说明书_Merck