慈溪企业网站建设/百度一键安装
目录
将数据存储到文件中
创建文件和保存数据
读取文件
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)隐藏系统的复杂性,它为子系统中的一组接口提供一个统一的高层接口,使得这些接口更加容易使用。外观模式通过封装子系统内部的复杂性,提…...

uniapp-hubildx配置
1.配置浏览器 (1)运行》运行到浏览器配置》配置web服务器 (2)选择浏览器安装路径 (3)浏览器安装路径: (3.1) 右键点击图标》属性 (3.2)选择目标&…...

Nginx基础篇:Nginx搭建、Nginx反向代理、文件服务器部署配置。
Nginx Linux系统安装以及反向代理的配置 简介优点nginx 环境安装常用Nginx 命令nginx 文件服务器搭建 简介 Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务。Nginx是由伊戈尔赛索耶夫为俄罗斯访问量第二的Rambler.ru站点…...

什么是TDR(威胁检测与响应)
网络安全是被动和主动方法的混合体。过去,企业往往局限于被动的方法,随着合规性和安全策略越来越受到重视,主动方法也越来越受到关注。与其他行业相比,网络安全是高度动态的,网络安全团队采用任何可以帮助他们优化的新…...

30、pytest入门内容回顾
整体结构 解读与实操 pytest30讲主要从四个方面由浅入深的进行解读, 开始 讲解了pytest的概述,安装前的准备工作(python,pycharm,pytest),运行方式(命令行),断言(assert…...

2023年 - 我的程序员之旅和成长故事
2023年 - 我的程序员之旅和成长故事 🔥 1.前言 大家好,我是Leo哥🫣🫣🫣,今天咱们不聊技术,聊聊我自己,聊聊我从2023年年初到现在的一些经历和故事,我也很愿意我的故事分…...

JMH性能测试
一、JMH JMH,全称Java Microbenchmark Harness(微基准测试框架),是专门用于Java代码微基准测试的一套测试工具API,是由Java虚拟机团队开发的,一般用于代码的性能调优。 BenchMark又叫做基准测试,…...

超完整的mysql安装配置方法(包含idea和navicat连接mysql,并实现建表)
mysql安装配置方法 1、下载mysql2、解压到指定的安装目录3、配置初始化文件my.ini4、配置用户变量和系统变量5、初始化mysql6、安装mysql服务并启动修改密码7、使用idea连接mysql8、使用Navicat可视化工具连接mysql,并实现新建数据库,新建表 1、下载mysq…...

通过仿真理解完整的阵列信号噪声模型
概要 噪声对无线电设备的信号接收会造成影响,是通信、雷达、导航、遥感等工程应用领域中的关键考虑因素。通常认为阵列合成能够提升信噪比,但忽略了这一论断的前提,即不同通道引入的噪声互不相关。但实际应用中,接收的噪声不仅仅包含信道引入的不相关噪声,还包含从外界环…...

问题:数组对象去重
问题:数组对象去重 var arr [{name: ‘a’,id: 1}, {name: ‘a’,id: 2}, {name: ‘b’,id: 3}, {name: ‘c’,id: 4}, {name: ‘c’,id: 6}, {name: ‘b’,id: 6}, {name: ‘d’,id: 7}]; 对数组对象name进行去重处理, 结果显示为: [{name…...

前端:让一个div悬浮在另一个div之上
使用 CSS 的 position 属性和 z-index 属性 首先,将第二个 div 元素的 position 属性设为 relative 或 absolute。这样可以让该元素成为一个定位元素,使得后代元素可以相对于它进行定位。 然后,将要悬浮的 div 元素的 position 属性设为 ab…...