当前位置: 首页 > news >正文

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 知识点 &#xff08;1&#xff09;掌握Android数据存储的分类&#xff1b; &#xff08;2&#xff09;可以使用SharedPreferences存储数据。 1.2 具体内容 对于我们数据的存储而言&#xff0c;Android一共提供了5个数据存储的方式&#xff1a;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 这节课我们将学习编辑十六进制&#xff0c;主要用于编辑保存文件&#xff0c;但十六进制编辑涉及的技能可以很好地转移到&#xff1a; Save file editingRe…...

计算机毕设之Python的高校成绩分析(含文档+源码+部署)

本系统阐述的是一个高校成绩分析系统的设计与实现&#xff0c;对于Python、B/S结构、MySql进行了较为深入的学习与应用。主要针对系统的设计&#xff0c;描述&#xff0c;实现和分析与测试方面来表明开发的过程。开发中使用了 django框架和MySql数据库技术搭建系统的整体架构。…...

【Sentinel】核心API-Entry与Context

文章目录 一、Entry1、Entry的声明2、使用API自定义资源3、基于SentinelResource注解标记资源 二、Context1、Context介绍2、Context的初始化3、AbstractSentinelInterceptor4、ContextUtil 一、Entry 1、Entry的声明 默认情况下&#xff0c;Sentinel会将controller中的方法作…...

HashMap源码阅读解惑

HashMap的hash函数&#xff08;1.8&#xff09; 首先1.7的是四次扰动&#xff0c;1.8做了优化。 简单的说就是对key做hashCode操作&#xff0c;然后将得到的32为散列值向右位移16位&#xff0c;再与hashCode做异或计算。实质上是把一个数的低16位与他的高16位做异或运算。 st…...

如何解决前端传递数据给后端时精度丢失问题

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

使用Maven创建父子工程

&#x1f4da;目录 创建父工程创建子模块创建子模块示例创建认证模块(auth) 结束 创建父工程 选择空项目&#xff1a; 设置&#xff1a;项目名称&#xff0c;组件名称&#xff0c;版本号等 创建完成后的工程 因为我们需要设置这个工程为父工程所以不需要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.摘要&#xff1a;关键方法和结论&#xff08;精炼的语言&#xff09;要说明&#xff0c;方法的合理性和意义也可以说明。 评委先通过摘要筛选&#xff08;第一轮&#xff09; 2.时间序列找异常值除了3西格玛还有针对时间序列更合适寻找的方法 3.模型的优缺点要写的详细一点…...

使用Spring来管理对象关系映射(ORM)

简介 对象关系映射&#xff08;Object-Relational Mapping&#xff0c;简称ORM&#xff09;是一种技术&#xff0c;用于在面向对象程序和关系型数据库之间进行数据的映射。Spring框架提供了强大的支持来简化和优化ORM开发过程。本文将介绍如何使用Spring来管理对象关系映射。 …...

【消息中间件】详解三大MQ:RabbitMQ、RocketMQ、Kafka

作者简介 前言 博主之前写过一个完整的MQ系列&#xff0c;包含RabbitMQ、RocketMQ、Kafka&#xff0c;从安装使用到底层机制、原理。专栏地址&#xff1a; https://blog.csdn.net/joker_zjn/category_12142400.html?spm1001.2014.3001.5482 本文是该系列的清单综述&#xf…...

算法:删除有序数组中的重复项---双指针[3]

1、题目&#xff1a; 对给定的有序数组 nums 删除重复元素&#xff0c;在删除重复元素之后&#xff0c;每个元素只出现一次&#xff0c;并返回新的长度&#xff0c;上述操作必须通过原地修改数组的方法&#xff0c;使用 O(1) 的空间复杂度完成。 2、分析特点&#xff1a; 题目…...

AR产业变革中的“关键先生”和“关键力量”

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

通过 Blob 对二进制流文件下载实现文件保存下载

原理&#xff1a;前端将二进制文件做转换实现下载: 请求后端接口->接收后端返回的二进制流(通过二进制流&#xff08;Blob&#xff09;下载,把后端返回的二进制文件放在 Blob 里面)->再通过file-saver插件保存 页面上使用&#xff1a; <span click"downloadFil…...

微信小程序使用lime-echart踩坑记录

一、使用echarts包 微信小程序项目使用的是uni-app&#xff0c;插件是lime-echart&#xff0c;版本一开始安装的是lime-echart-0.7.9&#xff1b;在项目分包之后&#xff0c;为了避免主包过大&#xff0c;就将这个插件也一并搬到了分包中&#xff0c;在微信开发者工具中表现出…...

Unity 编辑器资源导入处理函数 OnPostprocessTexture :深入解析与实用案例

Unity 编辑器资源导入处理函数 OnPostprocessTexture 用法 点击封面跳转下载页面 简介 在Unity中&#xff0c;我们可以使用编辑器资源导入处理函数&#xff08;OnPostprocessTexture&#xff09;来自定义处理纹理资源的导入过程。这个函数是继承自AssetPostprocessor类的&…...

stable diffusion实践操作-宽高设置以及高清修复

系列文章目录 stable diffusion实践操作 文章目录 系列文章目录前言一、SD宽高怎么设置&#xff1f;1.1 宽高历史 二、高清修复1. 文生图中的高清修复1.按钮Hires.fix2.不同放大算法对比1.第一类2.第二类3.第三类4.第四类5.第五类6.第六类7.第七类8.第八类9.第九类10.第十类11…...

利用微调的deberta-v3-large来预测情感分类

前言&#xff1a; 昨天我们讲述了怎么利用emotion数据集进行deberta-v3-large大模型的微调&#xff0c;那今天我们就来输入一些数据来测试一下&#xff0c;看看模型的准确率&#xff0c;为了方便起见&#xff0c;我直接用测试集的前十条数据 代码&#xff1a; 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)# 进行…...

C++初阶-list的底层

目录 1.std::list实现的所有代码 2.list的简单介绍 2.1实现list的类 2.2_list_iterator的实现 2.2.1_list_iterator实现的原因和好处 2.2.2_list_iterator实现 2.3_list_node的实现 2.3.1. 避免递归的模板依赖 2.3.2. 内存布局一致性 2.3.3. 类型安全的替代方案 2.3.…...

如何在看板中有效管理突发紧急任务

在看板中有效管理突发紧急任务需要&#xff1a;设立专门的紧急任务通道、重新调整任务优先级、保持适度的WIP&#xff08;Work-in-Progress&#xff09;弹性、优化任务处理流程、提高团队应对突发情况的敏捷性。其中&#xff0c;设立专门的紧急任务通道尤为重要&#xff0c;这能…...

LLM基础1_语言模型如何处理文本

基于GitHub项目&#xff1a;https://github.com/datawhalechina/llms-from-scratch-cn 工具介绍 tiktoken&#xff1a;OpenAI开发的专业"分词器" torch&#xff1a;Facebook开发的强力计算引擎&#xff0c;相当于超级计算器 理解词嵌入&#xff1a;给词语画"…...

Mac下Android Studio扫描根目录卡死问题记录

环境信息 操作系统: macOS 15.5 (Apple M2芯片)Android Studio版本: Meerkat Feature Drop | 2024.3.2 Patch 1 (Build #AI-243.26053.27.2432.13536105, 2025年5月22日构建) 问题现象 在项目开发过程中&#xff0c;提示一个依赖外部头文件的cpp源文件需要同步&#xff0c;点…...

基于Java Swing的电子通讯录设计与实现:附系统托盘功能代码详解

JAVASQL电子通讯录带系统托盘 一、系统概述 本电子通讯录系统采用Java Swing开发桌面应用&#xff0c;结合SQLite数据库实现联系人管理功能&#xff0c;并集成系统托盘功能提升用户体验。系统支持联系人的增删改查、分组管理、搜索过滤等功能&#xff0c;同时可以最小化到系统…...

Aspose.PDF 限制绕过方案:Java 字节码技术实战分享(仅供学习)

Aspose.PDF 限制绕过方案&#xff1a;Java 字节码技术实战分享&#xff08;仅供学习&#xff09; 一、Aspose.PDF 简介二、说明&#xff08;⚠️仅供学习与研究使用&#xff09;三、技术流程总览四、准备工作1. 下载 Jar 包2. Maven 项目依赖配置 五、字节码修改实现代码&#…...

深度剖析 DeepSeek 开源模型部署与应用:策略、权衡与未来走向

在人工智能技术呈指数级发展的当下&#xff0c;大模型已然成为推动各行业变革的核心驱动力。DeepSeek 开源模型以其卓越的性能和灵活的开源特性&#xff0c;吸引了众多企业与开发者的目光。如何高效且合理地部署与运用 DeepSeek 模型&#xff0c;成为释放其巨大潜力的关键所在&…...

《信号与系统》第 6 章 信号与系统的时域和频域特性

目录 6.0 引言 6.1 傅里叶变换的模和相位表示 6.2 线性时不变系统频率响应的模和相位表示 6.2.1 线性与非线性相位 6.2.2 群时延 6.2.3 对数模和相位图 6.3 理想频率选择性滤波器的时域特性 6.4 非理想滤波器的时域和频域特性讨论 6.5 一阶与二阶连续时间系统 6.5.1 …...

OCR MLLM Evaluation

为什么需要评测体系&#xff1f;——背景与矛盾 ​​ 能干的事&#xff1a;​​ 看清楚发票、身份证上的字&#xff08;准确率>90%&#xff09;&#xff0c;速度飞快&#xff08;眨眼间完成&#xff09;。​​干不了的事&#xff1a;​​ 碰到复杂表格&#xff08;合并单元…...

ArcPy扩展模块的使用(3)

管理工程项目 arcpy.mp模块允许用户管理布局、地图、报表、文件夹连接、视图等工程项目。例如&#xff0c;可以更新、修复或替换图层数据源&#xff0c;修改图层的符号系统&#xff0c;甚至自动在线执行共享要托管在组织中的工程项。 以下代码展示了如何更新图层的数据源&…...