Android Kotlin语言下的文件存储
目录
将数据存储到文件中
创建文件和保存数据
读取文件
Activity类中的getPreferences()方法
SQLite数据库存储
创建数据库
调用数据库
操作数据库
增
删
改
查
升级数据库
将数据存储到文件中
创建文件和保存数据
Context类中提供了一个openFileOutput()方法,可以用于将数据存储到指定的文件中。这个方法接收两个参数:第一个参数是文件名,在文件创建的时候使用,注意这里指定的文件名不可以包含路径,因为所有的文件都默认存储到/data/data/<package name>/files/目录下;第二个参数是文件的操作模式,主要有MODE_PRIVATE和MODE_APPEND两种模式可选,默认是MODE_PRIVATE,表示当指定相同文件名的时候,所写入的内容将会覆盖原文件中的内容,而MODE_APPEND则表示如果该文件已存在,就往文件里面追加内容,不存在就创建新文件。其实文件的操作模式本来还有另外两种:MODE_WORLD_READABLE和MODE_WORLD_WRITEABLE。这两种模式表示允许其他应用程序对我们程序中的文件进行读写操作,不过由于这两种模式过于危险,很容易引起应用的安全漏洞,已在Android 4.2版本中被废弃。
openFileOutput()方法返回的是一个FileOutputStream对象,得到这个对象之后就可以使用Java流的方式将数据写入文件中了。以下是一段简单的代码示例,展示了如何将一段文本内容保存到文件中:
fun saveFile(saveString: String) {val output = openFileOutput("fileName", Context.MODE_PRIVATE)val writer = BufferedWriter(OutputStreamWriter(output))writer.use {it.write(saveString)}}
这里通过openFileOutput()方法能够得到一个FileOutputStream对象,然后借助它构建出一个OutputStreamWriter对象,接着再使用OutputStreamWriter构建出一个BufferedWriter对象,这样你就可以通过BufferedWriter将文本内容写入文件中了。
注意,这里还使用了一个use函数,这是Kotlin提供的一个内置扩展函数。它会保证在Lambda表达式中的代码全部执行完之后自动将外层的流关闭,这样就不需要我们再编写一个finally语句,手动去关闭流了,是一个非常好用的扩展函数。
另外,Kotlin是没有异常检查机制(checked exception)的。这意味着使用Kotlin编写的所有代码都不会强制要求你进行异常捕获或异常抛出。即使你不写try catch代码块,在Kotlin中依然可以编译通过。
读取文件
类似于将数据存储到文件中,Context类中还提供了一个openFileInput()方法,用于从文件中读取数据。这个方法要比openFileOutput()简单一些,它只接收一个参数,即要读取的文件名,然后系统会自动到/data/data/<package name>/files/目录下加载这个文件,并返回一个FileInputStream对象,得到这个对象之后,再通过流的方式就可以将数据读取出来了。
以下是一段简单的代码示例,展示了如何从文件中读取文本数据:
fun loadFile(): String {val stringBuilder = StringBuilder()val input = openFileInput("fileName")val reader = BufferedReader(InputStreamReader(input))reader.use {reader.forEachLine {stringBuilder.append(it)}}return stringBuilder.toString()}
在这段代码中,首先通过openFileInput()方法获取了一个FileInputStream对象,然后借助它又构建出了一个InputStreamReader对象,接着再使用InputStreamReader构建出一个BufferedReader对象,这样我们就可以通过BufferedReader将文件中的数据一行行读取出来,并拼接到StringBuilder对象当中,最后将读取的内容返回就可以了。
注意,这里从文件中读取数据使用了一个forEachLine函数,这也是Kotlin提供的一个内置扩展函数,它会将读到的每行内容都回调到Lambda表达式中,我们在Lambda表达式中完成拼接逻辑即可。
SharedPreferences存储
存储数据到SharedPreferences中
要想使用SharedPreferences存储数据,首先需要获取SharedPreferences对象。Android中主要提供了以下两种方法用于得到SharedPreferences对象。
-
Context类中的getSharedPreferences()方法此方法接收两个参数:第一个参数用于指定SharedPreferences文件的名称,如果指定的文件不存在则会创建一个,SharedPreferences文件都是存放在/data/data/<package name>/shared_prefs/目录下的;第二个参数用于指定操作模式,目前只有默认的
MODE_PRIVATE这一种模式可选,它和直接传入0的效果是相同的,表示只有当前的应用程序才可以对这个SharedPreferences文件进行读写。其他几种操作模式均已被废弃,MODE_WORLD_READABLE和MODE_WORLD_WRITEABLE这两种模式是在Android 4.2版本中被废弃的,MODE_MULTI_PROCESS模式是在Android 6.0版本中被废弃的。 -
Activity类中的getPreferences()方法这个方法和Context中的
getSharedPreferences()方法很相似,不过它只接收一个操作模式参数,因为使用这个方法时会自动将当前Activity的类名作为SharedPreferences的文件名。得到了
SharedPreferences对象之后,就可以开始向SharedPreferences文件中存储数据了,主要可以分为3步实现。(1) 调用
SharedPreferences对象的edit()方法获取一个SharedPreferences.Editor对象。(2) 向
SharedPreferences.Editor对象中添加数据,比如添加一个布尔型数据就使用putBoolean()方法,添加一个字符串则使用putString()方法,以此类推。(3) 调用
apply()方法将添加的数据提交,从而完成数据存储操作。
代码示例如下
fun saveSharedPreferences(saveString: String){val edit = getSharedPreferences("fileName",Context.MODE_PRIVATE).edit()edit.putString("editName","editValue")edit.apply()}
从SharedPreferences中读取数据
SharedPreferences对象中提供了一系列的get方法,用于读取存储的数据,每种get方法都对应了SharedPreferences.Editor中的一种put方法,比如读取一个布尔型数据就使用getBoolean()方法,读取一个字符串就使用getString()方法。这些get方法都接收两个参数:第一个参数是键,传入存储数据时使用的键就可以得到相应的值了;第二个参数是默认值,即表示当传入的键找不到对应的值时会以什么样的默认值进行返回。
代码示例如下
fun loadSharedPreferences(): String {val sharedPreferences = getSharedPreferences("fileName", Context.MODE_PRIVATE)return sharedPreferences.getString("editName", "defValue")!!}
SQLite数据库存储
创建数据库
Android为了让我们能够更加方便地管理数据库,专门提供了一个SQLiteOpenHelper帮助类,借助这个类可以非常简单地对数据库进行创建和升级。既然有好东西可以直接使用,那我们自然要尝试一下了,下面我就对SQLiteOpenHelper的基本用法进行介绍。
首先,你要知道SQLiteOpenHelper是一个抽象类,这意味着如果我们想要使用它,就需要创建一个自己的帮助类去继承它。SQLiteOpenHelper中有两个抽象方法:onCreate()和onUpgrade()。我们必须在自己的帮助类里重写这两个方法,然后分别在这两个方法中实现创建和升级数据库的逻辑。
SQLiteOpenHelper中还有两个非常重要的实例方法:getReadableDatabase()和getWritableDatabase()。这两个方法都可以创建或打开一个现有的数据库(如果数据库已存在则直接打开,否则要创建一个新的数据库),并返回一个可对数据库进行读写操作的对象。不同的是,当数据库不可写入的时候(如磁盘空间已满),getReadableDatabase()方法返回的对象将以只读的方式打开数据库,而getWritableDatabase()方法则将出现异常。
SQLiteOpenHelper中有两个构造方法可供重写,一般使用参数少一点的那个构造方法即可。这个构造方法中接收4个参数:第一个参数是Context,这个没什么好说的,必须有它才能对数据库进行操作;第二个参数是数据库名,创建数据库时使用的就是这里指定的名称;第三个参数允许我们在查询数据的时候返回一个自定义的Cursor,一般传入null即可;第四个参数表示当前数据库的版本号,可用于对数据库进行升级操作。构建出SQLiteOpenHelper的实例之后,再调用它的getReadableDatabase()或getWritableDatabase()方法就能够创建数据库了,数据库文件会存放在/data/data/<package name>/databases/目录下。此时,重写的onCreate()方法也会得到执行,所以通常会在这里处理一些创建表的逻辑。
我们建立一个代码示例如下:
class MyDatabaseHelper(private val context: Context,private val databaseName: String,val version: Int
) : SQLiteOpenHelper(context, databaseName, null, version) {private val createTable = "create table tableName(id integer primary key autoincrement, " +"key1 text," +"key2 real," +"key3 integer)"override fun onCreate(db: SQLiteDatabase?) {db?.execSQL(createTable)}override fun onUpgrade(db: SQLiteDatabase?, oldVersion: Int, newVersion: Int) {}
}
调用数据库
val myDatabaseHelper =MyDatabaseHelper(this,"databaseName",1)
myDatabaseHelper.writableDatabase
操作数据库
增
val myDatabaseHelper = MyDatabaseHelper(this, "databaseName", 1)
val db = myDatabaseHelper.writableDatabase
val value1 = ContentValues().apply {put("key1", "111")put("key2", 1.1)put("key3", 1)
}
db.insert("tableName", null, value1)val value2 = ContentValues().apply {put("key1", "222")put("key2", 2.2)put("key3", 2)
}
db.insert("tableName", null, value2)
删
db.delete(tableName, "key2 = ? and key3 = ? ", arrayOf("2.2","2"))
改
val value3 = ContentValues().apply {put("key1", "444")}
db.update(tableName, value3, "key2 = ?", arrayOf("1.1"))
查
val course = db.query(tableName, null, null, null, null, null, null)if (course.moveToFirst()) {do {println(course.getString(course3.getColumnIndex("key1")))println(course.getString(course.getColumnIndex("key2")))println(course.getString(course.getColumnIndex("key3")))} while (course.moveToNext())}course.close()
升级数据库
在MyDatabaseHelper类中,我们还有一个onUpgrade的方法没有使用,这个方法就是用来升级数据库的,当我们需要升级数据库时,改写MyDatabaseHelper的version,让它大于我们直接传入的数,这样就会自动调用onUpgrade,示例代码如下:
val myDatabaseHelper = MyDatabaseHelper(this, databaseName, 2)
然后我们在onUpgrade方法中编写升级逻辑,代码如下:
class MyDatabaseHelper(private val context: Context,private val databaseName: String,val version: Int
) : SQLiteOpenHelper(context, databaseName, null, version) {private val createTable = "create table tableName(id integer primary key autoincrement, " +"key1 text," +"key2 real," +"key3 integer)"private val createTable2 = "create table tableName2(id integer primary key autoincrement, " +"key1 text," +"key2 real," +"key3 integer)"override fun onCreate(db: SQLiteDatabase?) {db?.execSQL(createTable)db?.execSQL(createTable2)}override fun onUpgrade(db: SQLiteDatabase?, oldVersion: Int, newVersion: Int) {if (oldVersion<=1){db?.execSQL(createTable2)}}
}
当原来的版本是1时,我们就创建表2,不然就执行onCreate方法,创建表1表2。如果后续我们需要再表1中增加一个字段 tableName_id,那么我们将传入的version改成3,再在onUpgrade方法中编写如下代码:
override fun onUpgrade(db: SQLiteDatabase?, oldVersion: Int, newVersion: Int) {if (oldVersion<=1){db?.execSQL(createTable2)}if (oldVersion<=2){db?.execSQL("alter table tableName add column tableName_id integer")}}
这样我们就能在表1中新增一个tableName_id字段了
相关文章:
Android Kotlin语言下的文件存储
目录 将数据存储到文件中 创建文件和保存数据 读取文件 SharedPreferences存储 存储数据到SharedPreferences中 Context类中的getSharedPreferences()方法 Activity类中的getPreferences()方法 从SharedPreferences中读取数据 SQLite数据库存储 创建数据库 调用数据…...
Verilog 入门(八)(验证)
文章目录 编写测试验证程序波形产生值序列重复模式 测试验证程序实例从文本文件中读取向量实例:时序检测器 测试验证程序用于测试和验证设计方法的正确性。Verilog 提供强有力的结构来说明测试验证程序。 编写测试验证程序 测试验证程序有三个主要目的:…...
vue3 vue-router 导航守卫 (五)
在Vue 3中,导航守卫仍然是一个重要的概念,用于在路由切换时执行一些特定的逻辑。Vue Router提供了多个导航守卫,包括全局守卫、路由独享守卫和组件内守卫。可以在路由切换时执行一些特定的逻辑,例如身份验证、权限控制、数据加载等…...
Git命令---查看远程仓库
介绍 使用git命令查看绑定的远程仓库。 命令 git remote -v...
12.8作业
1. 使用手动连接,将登录框中的取消按钮使用qt4版本的连接到自定义的槽函数中,在自定义的槽函数中调用关闭函数 将登录按钮使用qt5版本的连接到自定义的槽函数中,在槽函数中判断ui界面上输入的账号是否为"admin",密码是…...
算法:有效的括号(入栈出栈)
时间复杂度 O(n) 空间复杂度 O(n∣Σ∣),其中 Σ 表示字符集,本题中字符串只包含 6 种括号 /*** param {string} s* return {boolean}*/ var isValid function(s) {const map {"(":")","{":"}","["…...
vxworks常用的指令归纳
目的:方便自己查阅 tftpboot 0x10000000 vxworks bootelf 0x10000000 ifconfig "gem0 dowm" ifconfig "gem0 inet 192.168.0.81" ifconfig "gem0 lladdr 01:02:03:04:05:06:07" ifconfig "gem0 up" ld 0,1,"…...
线性回归实战
3.1 使用正规方程进行求解 3.1.1 简单线性回归 公式 : y w x b y wx b ywxb 一元一次方程,在机器学习中一元表示一个特征,b表示截距,y表示目标值。 使用代码进行实现: 导入包 import numpy as np import matp…...
stm32 使用18B20 测试温度
用18b20 测试温度是非常常用的,不过18B20的调试不是这么容易的,有些内容网上很多的,不再重复说了,我先把波形说一下,再说程序部分: 整个都温度数据的顺序是: 1.700uS的低电平复位并测试18B20的…...
【Delphi】一个函数实现ios,android震动功能 Vibrate(包括3D Touch 中 Peek 震动等)
一、前言 我们在开发移动端APP的时候,有时可能需要APP能够提供震动功能,以便提醒操作者,特别是ios提供的3D Touch触感功能,操作者操作时会有触感震动,给操作者的感觉很友好。那么,在Delphi的移动端FMX开发中…...
国产Type-C PD芯片—接口快充取电芯片
常用USB PDTYPE-C受电端,即设备端协议IC芯片(PD Sink,也叫PD诱骗芯片),诱导取电芯片。 产品介绍 LDR6328: ◇ 采用 SOP-8 封装 ◇ 兼容 USB PD 3.0 规范,支持 USB PD 2.0 ◇ 兼容 QC 3.0 规范&#x…...
pytorch学习6-非线性变换(ReLU和sigmoid)
系列文章目录 pytorch学习1-数据加载以及Tensorboard可视化工具pytorch学习2-Transforms主要方法使用pytorch学习3-torchvisin和Dataloader的使用pytorch学习4-简易卷积实现pytorch学习5-最大池化层的使用pytorch学习6-非线性变换(ReLU和sigmoid)pytorc…...
详解Keras3.0 Models API: Whole model saving loading
1、save方法 Model.save(filepath, overwriteTrue, **kwargs) 将模型另存为.keras文件 参数说明 filepath: 保存模型的路径。必须以.keras结尾overwrite:布尔值,表示是否覆盖已存在的文件。默认为 True,即覆盖已存在的文件。save_format…...
Spring Cloud Gateway 网关的基础使用
1. 什么是网关?网关有什么用? 在微服务架构中,网关就是一个提供统一访问地址的组件,它解决了内部微服务与外部的交互问题。网关主要负责流量的路由和转发,将外部请求引到对应的微服务实例上。同时提供身份认证、授权、…...
小米手机锁屏时间设置为永不休眠_手机不息屏_保持亮屏
环境:打开手机自带的锁屏时间设置发现没有 永不息屏的选项 原因:采用了三星OLED屏幕,所以根据OLED屏幕特性,这个是为了防止烧屏而特意设计的。非OLED机型支持设置“永不” 解决方案1:原生系统是支持永不锁屏的&#…...
lightdb plorasql集合类型新增可变数组
文章目录 背景集合类型可变数组可变数组示例 背景 在信创适配中,从Oracle迁移过来的存储过程使用到可变数组。因此在LightDB-X 23.4版本中对现有的集合类型进行了增强,添加了可变数组类型。 集合类型 在LightDB-X 23.4版本开始plorasql支持的集合类型…...
算法--最短路
这里写目录标题 xmind单源最短路简介所有边权都是正朴素的Dijkstra算法思想例子题解 堆优化版的Dijkstra算法 存在负数权Bellman-Ford算法思想例子题解 spfa算法思想例子题解 spfa判断负环思想例子题解 多源汇最短路简介弗洛伊德算法思想例子题解 小tips xmind 上述中ÿ…...
Linux 定时任务备份MySQL数据库
Linux 定时任务基本知识 crontab yum install crontabs (安装 crontabs) systemctl enable crond (设为开机启动) systemctl start crond(启动crond服务) systemctl status crond (查看状态&a…...
查询服务器CPU、内存、磁盘、网络IO、队列、数据库占用空间等等信息
文章目录 摘要1. 查询CPU使用率命令:top -bn1 | grep \"Cpu(s)\" | awk {split($0,arr,\" \");print 100-arr[8]}2. 查询内存命令(单位:G):top -bn1 | grep \"KiB Mem\" | awk {split($…...
外观模式 rust和java的实现
文章目录 外观模式介绍实现javarustrust仓库 外观模式 外观模式(Facade Pattern)隐藏系统的复杂性,它为子系统中的一组接口提供一个统一的高层接口,使得这些接口更加容易使用。外观模式通过封装子系统内部的复杂性,提…...
多目标贝叶斯优化在复杂量子动力学模型参数校准中的应用
1. 项目概述与核心挑战在光化学和生物物理领域,模拟视网膜在视紫红质中的光异构化反应,是理解视觉初始步骤的基石。这个反应看似简单——一个分子键的旋转,但其背后的量子动力学过程却异常复杂。传统上,我们依赖量子化学计算来构建…...
如何快速搭建高性能Minecraft服务器:CatServer终极整合方案
如何快速搭建高性能Minecraft服务器:CatServer终极整合方案 【免费下载链接】CatServer 高性能和高兼容性的1.12.2/1.16.5/1.18.2版本ForgeBukkitSpigot服务端 (A high performance and high compatibility 1.12.2/1.16.5/1.18.2 version ForgeBukkitSpigot server)…...
达梦数据库-数据库主备集群更改实例目录及相关目录步骤-记录总结
1达梦数据库-数据库主备集群更改实例目录及相关目录步骤-记录总结 1.1常见需求 当前数据库实例所在磁盘性能较差或空间不足,需格式化性能较好空间足的新磁盘并挂载,挂载到原目录或者新目录,然后把数据库实例目录移动到新磁盘。 1.2流程步骤…...
为 OpenClaw 配置 Taotoken 以实现稳定可靠的 Agent 工作流
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 为 OpenClaw 配置 Taotoken 以实现稳定可靠的 Agent 工作流 对于使用 OpenClaw 框架构建智能体(Agent)的开…...
终极指南:如何快速掌握UE4 Advanced Sessions Plugin会话管理插件
终极指南:如何快速掌握UE4 Advanced Sessions Plugin会话管理插件 【免费下载链接】AdvancedSessionsPlugin Advanced Sessions Plugin for UE4 项目地址: https://gitcode.com/gh_mirrors/ad/AdvancedSessionsPlugin Advanced Sessions Plugin是虚幻引擎4中…...
字典树(Trie)详解 + Java 代码实现
目录 一、字典树核心概念 1. 结构特点 2. 核心应用场景 3. 时间复杂度 二、字典树结构设计 三、完整 Java 代码实现 四、代码逐段讲解 1. 节点类 TrieNode 2. 插入方法 insert 3. 查询单词 search 4. 查询前缀 startsWith 五、字典树优点 vs 缺点 优点 缺点 六、…...
HS2-HF Patch:为HoneySelect2打造的全能增强解决方案
HS2-HF Patch:为HoneySelect2打造的全能增强解决方案 【免费下载链接】HS2-HF_Patch Automatically translate, uncensor and update HoneySelect2! 项目地址: https://gitcode.com/gh_mirrors/hs/HS2-HF_Patch 如果你正在寻找一种简单高效的方式来提升Honey…...
3步解锁Heightmapper:从地图到3D地形的终极转换指南
3步解锁Heightmapper:从地图到3D地形的终极转换指南 【免费下载链接】heightmapper interactive heightmaps from terrain data 项目地址: https://gitcode.com/gh_mirrors/he/heightmapper 还在为寻找真实地形数据而烦恼吗?还在为3D建模中的地形…...
PvZ Toolkit终极指南:解锁植物大战僵尸无限可能的开源修改器
PvZ Toolkit终极指南:解锁植物大战僵尸无限可能的开源修改器 【免费下载链接】pvztoolkit 植物大战僵尸 PC 版综合修改器 项目地址: https://gitcode.com/gh_mirrors/pv/pvztoolkit PvZ Toolkit是一款专为《植物大战僵尸》PC版设计的开源游戏修改工具&#x…...
如何用Python双引擎架构实现90%成功率的自动抢票系统?
如何用Python双引擎架构实现90%成功率的自动抢票系统? 【免费下载链接】Automatic_ticket_purchase 大麦网抢票脚本 项目地址: https://gitcode.com/GitHub_Trending/au/Automatic_ticket_purchase 当热门演唱会门票在几秒内售罄,当体育赛事门票成…...
