Android——数据存储(一)(二十一)
1. 数据存储
1.1 知识点
(1)掌握Android数据存储的分类;
(2)可以使用SharedPreferences存储数据。
1.2 具体内容
对于我们数据的存储而言,Android一共提供了5个数据存储的方式:SharedPreferences存储、文件存储方式、Sqlite存储、Content Provider存储、网络存储。
在Android之中操作,都需要使用Activity程序进行支持,本次课程我们只关注操作方法,所有不做过多的页面展示。
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"><LinearLayout android:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="horizontal"><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="请输入键:"/><EditTextandroid:id="@+id/usernameKey"android:layout_width="200px"android:layout_height="wrap_content" /></LinearLayout><LinearLayout android:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="horizontal"><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="请输入值:"/><EditTextandroid:id="@+id/username"android:layout_width="200px"android:layout_height="wrap_content" /></LinearLayout><Button android:id="@+id/mybut"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="保存"/>
</LinearLayout>
现在的关键问题就在于编写Activity程序。
package com.example.sharedpreferences;import android.app.Activity;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.widget.TextView;public class SharedPreferencesActivity extends Activity {private TextView username = null;private TextView age = null;public static final String FILMNAME = "wanczy";@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);super.setContentView(R.layout.activity_shared_preferences);this.age = (TextView) super.findViewById(R.id.age);this.username = (TextView) super.findViewById(R.id.username);SharedPreferences share = super.getSharedPreferences(FILMNAME, Activity.MODE_PRIVATE);this.username.setText("用户名:"+ share.getString("username", "无所谓默认值"));//根据键取得值并放入到TextView中this.age.setText("年龄:"+ share.getInt("年龄",0));}}
和在Java中使用属性存储操作上有相似之处,但是Java中的属性存储已经过时,现在存储比较流行的是xml存储。此时程序就已经完成了,默认情况下,存储文件都会保存在手机里面,后缀为.xml,现在程序已经可以保存,当然也可以读取咯。
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical" ><TextViewandroid:id="@+id/username"android:layout_width="wrap_content"android:layout_height="wrap_content" /><TextViewandroid:id="@+id/age"android:layout_width="wrap_content"android:layout_height="wrap_content"/>
</LinearLayout>
package com.example.sharedpreferences;import android.app.Activity;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.widget.TextView;public class SharedPreferencesActivity extends Activity {private TextView username = null;private TextView age = null;public static final String FILMNAME = "wanczy";@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);super.setContentView(R.layout.activity_shared_preferences);this.age = (TextView) super.findViewById(R.id.age);this.username = (TextView) super.findViewById(R.id.username);SharedPreferences share = super.getSharedPreferences(FILMNAME, Activity.MODE_PRIVATE);this.username.setText("用户名:"+ share.getString("username", "无所谓默认值"));//根据键取得值并放入到TextView中this.age.setText("年龄:"+ share.getInt("age",0));}}
对于SharedPreferences存储而言,并没有太多复杂操作,实际应用当中,使用SharedPreferences可以保存一些配置信息:例如,你正在看小说,希望关闭之后,下次打开能够在你最后浏览的进度点,那么这种情况下就可以使用SharedPreferences进行保存 。
1.3 小结
(1)SharedPreferences可以实现简单的数据存储功能实现,可以利用super.getSharedPreferences()方法取得实例;
2. 文件存储
2.1 知识点
(1)掌握Activity对文件存储的若干操作;
(2)可以实现文件的保存和读取操作。
2.2 具体内容
对于文件存储这块,必须要先掌握IO的基本操作,InputStream,OutputStream。
了解一下IO流对文件的操作:
·使用File找到一个指定的文件
·使用字节流或者字符流的子类为父类进行实例化
·完成输入/输出的操作
·关闭流
举例:向文件中写入内容—输出,我们的输入输出是对于程序而言。
范例:本次还是以文件保存为主,不再进行页面的编写。
package com.example.filesave;import java.io.FileOutputStream;
import java.io.PrintStream;import android.app.Activity;
import android.os.Bundle;public class FileSaveActivity extends Activity {public static final String FILENAME = "wanczy.txt";@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);super.setContentView(R.layout.activity_file_save);FileOutputStream output = null;PrintStream out = null;try {output = super.openFileOutput(FILENAME, Activity.MODE_PRIVATE);//使用Activity提供的方法创建了一个文件字节输出流//在IO操作中,打印流操作是最方便的out = new PrintStream(output);out.print("姓名:毛栗子");out.print("年龄:30");out.print("地址:兰州市庆阳路128号");} catch (Exception e) {} finally{out.close();}}
}
那么现在既然可以写入内容到文件,当然我们也可以将内容从文件中拿出来,那么对于读取文件,那肯定需要将文件内容放入到TextView中显示。
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"><TextViewandroid:id="@+id/msg"android:layout_width="match_parent"android:layout_height="match_parent"/>
</LinearLayout>
以后的读取的内容就放在msg这个文本显示组件上,如果大家学习过Java的话,应该很清楚,使用PrintStream对于输出来说很方便,对于输入呢,使用什么最方便呢?使用扫描类肯定是最方便的,就是Scanner
package com.example.filesave;import java.io.FileInputStream;
import java.util.Scanner;import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;public class FileSaveActivity extends Activity {private static final String FILENAME = "wanczy.txt";private TextView msg = null;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);super.setContentView(R.layout.activity_file_save);this.msg = (TextView) super.findViewById(R.id.msg);FileInputStream input = null;Scanner sc = null;try {input = super.openFileInput(FILENAME);//使用Activity提供的方法创建了一个文件字节输出流//在IO操作中,打印流操作是最方便的sc = new Scanner(input);String content = sc.next();//读取数据this.msg.setText("读取的信息为:"+content);} catch (Exception e) {} finally{sc.close();}}
}
以上的这种写法就是比较标准的程序。
范例:向SD卡上保存文件
package com.example.filesave;import java.io.File;
import java.io.FileOutputStream;
import java.io.PrintStream;import android.app.Activity;
import android.os.Bundle;public class FileSaveActivity extends Activity {public static final String FILENAME = "/mnt/sdcard/wanczy/jjm/wanczy.txt";@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);super.setContentView(R.layout.activity_file_save);FileOutputStream output = null;PrintStream out = null;try {File file = new File(FILENAME);if(!file.getParentFile().exists()){//如果文件夹不存在file.mkdirs();}output = new FileOutputStream(file,true);//表示创建了一个文件的字节输出流 ,这种写法不能进行文件内容的追加//在IO操作中,打印流操作是最方便的out = new PrintStream(output);out.print("姓名:毛栗子");out.print("年龄:30");out.print("地址:兰州市庆阳路128号");} catch (Exception e) {} finally{if(null != out){out.close();}}}}
范例:向SD卡上保存文件
现在虽然程序写好了,既然是对SD card的操作,那么一定需要具备操作sdcard的权限。
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
现在我们只需要使用此类去判断sdcard是否存在。
if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){//表示存储目录能够进行你读写操作System.out.println("表示sdcard存在");}
package com.example.filesave;import java.io.File;
import java.io.FileOutputStream;
import java.io.PrintStream;import android.app.Activity;
import android.os.Bundle;
import android.os.Environment;
import android.widget.Toast;public class FileSaveActivity extends Activity {public static final String FILENAME = "/mnt/sdcard/wanczy/jjm/wanczy.doc";@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);super.setContentView(R.layout.activity_file_save);if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {// 表示存储目录能够进行你读写操作FileOutputStream output = null;PrintStream out = null;try {File file = new File(FILENAME);if (!file.getParentFile().exists()) {// 如果文件夹不存在file.mkdirs();}output = new FileOutputStream(file, true);// 表示创建了一个文件的字节输出流// ,这种写法不能进行文件内容的追加// 在IO操作中,打印流操作是最方便的out = new PrintStream(output);out.print("《幽窗小记》 宠若不惊 闲看庭前花开花落 去留无意 漫随天外云卷云舒");} catch (Exception e) {} finally {if (null != out) {out.close();}}}else{Toast.makeText(this, "sdcard不存在,请使用其他保存路径", Toast.LENGTH_SHORT).show();}}}
这个程序更加适合在真机上进行操作。现在已经完成输出的功能,现在进行一些输入的显示。
package com.example.filesave;import java.io.File;
import java.io.FileInputStream;
import java.util.Scanner;import android.app.Activity;
import android.os.Bundle;
import android.os.Environment;
import android.widget.TextView;
import android.widget.Toast;public class FileSaveActivity extends Activity {private static final String FILENAME = "wanczy.doc";private static final String DIR = "CSDN/mlz";private TextView msg = null;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);super.setContentView(R.layout.activity_file_save);this.msg = (TextView) super.findViewById(R.id.msg);if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {FileInputStream input = null;Scanner sc = null;try {File file = new File(Environment.getExternalStorageDirectory().toString()+File.separator+DIR+File.separator+FILENAME);input = new FileInputStream(file);sc = new Scanner(input);while(sc.hasNext()){this.msg.append( sc.next());}} catch (Exception e) {} finally {sc.close();}}else{Toast.makeText(this, "sdcard不存在,请使用其他保存路径", Toast.LENGTH_SHORT).show();}}
}
以上保存在sdcard的程序与之前的不保存在sdcard并没有本质的区别。
package com.example.filesave;import java.io.InputStream;
import java.util.Scanner;import android.app.Activity;
import android.content.res.Resources;
import android.os.Bundle;
import android.widget.TextView;public class FileSaveActivity extends Activity {private TextView msg = null;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);super.setContentView(R.layout.activity_file_save);this.msg = (TextView) super.findViewById(R.id.msg);Resources res = super.getResources();//取得Resources对象InputStream in = res.openRawResource(R.raw.wanczy);//将资源文件加入到字节输入流、Scanner sc = null;StringBuffer sb = new StringBuffer();try {sc = new Scanner(in);while(sc.hasNext()){sb.append(sc.next()+"\n");}}catch(Exception e){}finally{sc.close();}this.msg .setText(sb.toString());}}
2.3 小结
(1)使用文件存储可以保存更加丰富的数据;
(2)在Android之中可以使用XML的DOM和SAX解析方式进行文件操作;
(3)在Android之中提供了PULL解析用于完成XML解析;
(4)JSON可以进行简便的信息传送,性能更高;
(5)可以将要读取的文件配置到项目的res文件目录之中,这样可以采用Resource直接进行资源文件的读取。
相关文章:

Android——数据存储(一)(二十一)
1. 数据存储 1.1 知识点 (1)掌握Android数据存储的分类; (2)可以使用SharedPreferences存储数据。 1.2 具体内容 对于我们数据的存储而言,Android一共提供了5个数据存储的方式:SharedPrefe…...
机器学习课后习题 ---数学基础回顾
(一)选择题 1.函数y=1/(x+1)是 A.偶函数 B.奇函数 C.单调函数 D.无界函数 2.设f(sin(x/2)=cosx+1,则f(x)为() A.2x-2 B.2-2x C.1+2 …...

CS420 课程笔记 P4 - 以16进制形态编辑游戏文件
文章目录 IntroductionFinding save filesStringsUnicodeExample!Value searchHealth searchConclusion Introduction 这节课我们将学习编辑十六进制,主要用于编辑保存文件,但十六进制编辑涉及的技能可以很好地转移到: Save file editingRe…...

计算机毕设之Python的高校成绩分析(含文档+源码+部署)
本系统阐述的是一个高校成绩分析系统的设计与实现,对于Python、B/S结构、MySql进行了较为深入的学习与应用。主要针对系统的设计,描述,实现和分析与测试方面来表明开发的过程。开发中使用了 django框架和MySql数据库技术搭建系统的整体架构。…...

【Sentinel】核心API-Entry与Context
文章目录 一、Entry1、Entry的声明2、使用API自定义资源3、基于SentinelResource注解标记资源 二、Context1、Context介绍2、Context的初始化3、AbstractSentinelInterceptor4、ContextUtil 一、Entry 1、Entry的声明 默认情况下,Sentinel会将controller中的方法作…...
HashMap源码阅读解惑
HashMap的hash函数(1.8) 首先1.7的是四次扰动,1.8做了优化。 简单的说就是对key做hashCode操作,然后将得到的32为散列值向右位移16位,再与hashCode做异或计算。实质上是把一个数的低16位与他的高16位做异或运算。 st…...

如何解决前端传递数据给后端时精度丢失问题
解决精度丢失 有时候我们在进行修改操作时,发现修改既不报错也不生效。我们进行排查后发现服务器端将数据返回给前端时没有出错,但是前端js将数据进行处理时却出错了,因为id是Long类型的,而js在处理后端返回给前端的Long类型数据…...

使用Maven创建父子工程
📚目录 创建父工程创建子模块创建子模块示例创建认证模块(auth) 结束 创建父工程 选择空项目: 设置:项目名称,组件名称,版本号等 创建完成后的工程 因为我们需要设置这个工程为父工程所以不需要src下的所有文件 在pom…...

Vue+elementUI 导出word打印
import JSZipUtils from "jszip-utils"; import JSZip from "pizzip"; import Docxtemplater from "docxtemplater"; npm安装以上依赖 首先维护个word模板 导出方法 //导出wordskipOutWord(row) {var printData rowconst data JSON.parse(JS…...

数学建模-点评笔记 9月3日
1.摘要:关键方法和结论(精炼的语言)要说明,方法的合理性和意义也可以说明。 评委先通过摘要筛选(第一轮) 2.时间序列找异常值除了3西格玛还有针对时间序列更合适寻找的方法 3.模型的优缺点要写的详细一点…...
使用Spring来管理对象关系映射(ORM)
简介 对象关系映射(Object-Relational Mapping,简称ORM)是一种技术,用于在面向对象程序和关系型数据库之间进行数据的映射。Spring框架提供了强大的支持来简化和优化ORM开发过程。本文将介绍如何使用Spring来管理对象关系映射。 …...

【消息中间件】详解三大MQ:RabbitMQ、RocketMQ、Kafka
作者简介 前言 博主之前写过一个完整的MQ系列,包含RabbitMQ、RocketMQ、Kafka,从安装使用到底层机制、原理。专栏地址: https://blog.csdn.net/joker_zjn/category_12142400.html?spm1001.2014.3001.5482 本文是该系列的清单综述…...

算法:删除有序数组中的重复项---双指针[3]
1、题目: 对给定的有序数组 nums 删除重复元素,在删除重复元素之后,每个元素只出现一次,并返回新的长度,上述操作必须通过原地修改数组的方法,使用 O(1) 的空间复杂度完成。 2、分析特点: 题目…...

AR产业变革中的“关键先生”和“关键力量”
今年6月的WWDC大会上,苹果发布了头显产品Vision Pro,苹果CEO库克形容它: 开启了空间计算时代。 AR产业曾红极一时,但因为一些技术硬伤又减弱了声量,整个产业在起伏中前行。必须承认,这次苹果发布Vision P…...

通过 Blob 对二进制流文件下载实现文件保存下载
原理:前端将二进制文件做转换实现下载: 请求后端接口->接收后端返回的二进制流(通过二进制流(Blob)下载,把后端返回的二进制文件放在 Blob 里面)->再通过file-saver插件保存 页面上使用: <span click"downloadFil…...
微信小程序使用lime-echart踩坑记录
一、使用echarts包 微信小程序项目使用的是uni-app,插件是lime-echart,版本一开始安装的是lime-echart-0.7.9;在项目分包之后,为了避免主包过大,就将这个插件也一并搬到了分包中,在微信开发者工具中表现出…...

Unity 编辑器资源导入处理函数 OnPostprocessTexture :深入解析与实用案例
Unity 编辑器资源导入处理函数 OnPostprocessTexture 用法 点击封面跳转下载页面 简介 在Unity中,我们可以使用编辑器资源导入处理函数(OnPostprocessTexture)来自定义处理纹理资源的导入过程。这个函数是继承自AssetPostprocessor类的&…...

stable diffusion实践操作-宽高设置以及高清修复
系列文章目录 stable diffusion实践操作 文章目录 系列文章目录前言一、SD宽高怎么设置?1.1 宽高历史 二、高清修复1. 文生图中的高清修复1.按钮Hires.fix2.不同放大算法对比1.第一类2.第二类3.第三类4.第四类5.第五类6.第六类7.第七类8.第八类9.第九类10.第十类11…...
利用微调的deberta-v3-large来预测情感分类
前言: 昨天我们讲述了怎么利用emotion数据集进行deberta-v3-large大模型的微调,那今天我们就来输入一些数据来测试一下,看看模型的准确率,为了方便起见,我直接用测试集的前十条数据 代码: from transfor…...

opencv旋转图像
0 、使用旋转矩阵旋转 import cv2img cv2.imread(img.jpg, 1) (h, w) img.shape[:2] # 获取图像的宽和高# 定义旋转中心坐标 center (w / 2, h / 2)# 定义旋转角度 angle 90# 定义缩放比例 scale 1# 获得旋转矩阵 M cv2.getRotationMatrix2D(center, angle, scale)# 进行…...
uni-app学习笔记二十二---使用vite.config.js全局导入常用依赖
在前面的练习中,每个页面需要使用ref,onShow等生命周期钩子函数时都需要像下面这样导入 import {onMounted, ref} from "vue" 如果不想每个页面都导入,需要使用node.js命令npm安装unplugin-auto-import npm install unplugin-au…...
基础测试工具使用经验
背景 vtune,perf, nsight system等基础测试工具,都是用过的,但是没有记录,都逐渐忘了。所以写这篇博客总结记录一下,只要以后发现新的用法,就记得来编辑补充一下 perf 比较基础的用法: 先改这…...
生成 Git SSH 证书
🔑 1. 生成 SSH 密钥对 在终端(Windows 使用 Git Bash,Mac/Linux 使用 Terminal)执行命令: ssh-keygen -t rsa -b 4096 -C "your_emailexample.com" 参数说明: -t rsa&#x…...

【论文阅读28】-CNN-BiLSTM-Attention-(2024)
本文把滑坡位移序列拆开、筛优质因子,再用 CNN-BiLSTM-Attention 来动态预测每个子序列,最后重构出总位移,预测效果超越传统模型。 文章目录 1 引言2 方法2.1 位移时间序列加性模型2.2 变分模态分解 (VMD) 具体步骤2.3.1 样本熵(S…...

如何在最短时间内提升打ctf(web)的水平?
刚刚刷完2遍 bugku 的 web 题,前来答题。 每个人对刷题理解是不同,有的人是看了writeup就等于刷了,有的人是收藏了writeup就等于刷了,有的人是跟着writeup做了一遍就等于刷了,还有的人是独立思考做了一遍就等于刷了。…...
.Net Framework 4/C# 关键字(非常用,持续更新...)
一、is 关键字 is 关键字用于检查对象是否于给定类型兼容,如果兼容将返回 true,如果不兼容则返回 false,在进行类型转换前,可以先使用 is 关键字判断对象是否与指定类型兼容,如果兼容才进行转换,这样的转换是安全的。 例如有:首先创建一个字符串对象,然后将字符串对象隐…...
Typeerror: cannot read properties of undefined (reading ‘XXX‘)
最近需要在离线机器上运行软件,所以得把软件用docker打包起来,大部分功能都没问题,出了一个奇怪的事情。同样的代码,在本机上用vscode可以运行起来,但是打包之后在docker里出现了问题。使用的是dialog组件,…...

保姆级教程:在无网络无显卡的Windows电脑的vscode本地部署deepseek
文章目录 1 前言2 部署流程2.1 准备工作2.2 Ollama2.2.1 使用有网络的电脑下载Ollama2.2.2 安装Ollama(有网络的电脑)2.2.3 安装Ollama(无网络的电脑)2.2.4 安装验证2.2.5 修改大模型安装位置2.2.6 下载Deepseek模型 2.3 将deepse…...
iOS性能调优实战:借助克魔(KeyMob)与常用工具深度洞察App瓶颈
在日常iOS开发过程中,性能问题往往是最令人头疼的一类Bug。尤其是在App上线前的压测阶段或是处理用户反馈的高发期,开发者往往需要面对卡顿、崩溃、能耗异常、日志混乱等一系列问题。这些问题表面上看似偶发,但背后往往隐藏着系统资源调度不当…...
「全栈技术解析」推客小程序系统开发:从架构设计到裂变增长的完整解决方案
在移动互联网营销竞争白热化的当下,推客小程序系统凭借其裂变传播、精准营销等特性,成为企业抢占市场的利器。本文将深度解析推客小程序系统开发的核心技术与实现路径,助力开发者打造具有市场竞争力的营销工具。 一、系统核心功能架构&…...