1. 持久化技术分为3种,文件,sharedPreferences存储,数据库来存储;

目录

文件存储:

利用SharedPreferences中读取数据

SQLite创建数据库

更新

添加

删除

查找:


文件存储:

文件存储是 Android 中最基础的持久化方式,适合保存结构简单、体积小的文本或二进制数据,如日志、配置、缓存等,使用方便且无需数据库支持;但它不适合处理结构复杂或需要频繁查询的数据,缺乏并发处理能力与查询效率,且操作繁琐,维护成本高。适用于对数据结构要求不高的场景;

把数据存入到文件中:

通过openFileOutput()参数有两个,第一个是省略包名的文件名,不写路径,第二个参数是存储的方式,是追加还是新存,MODE_PRIVATE代表追加,MODE_END代表新存,返回的是一个fileoutput对象;

   FileOutputStream out = null;BufferedWriter writer = null;try {out = openFileOutput(FILE_NAME, MODE_PRIVATE);writer = new BufferedWriter(new OutputStreamWriter(out));writer.write(inputText);} catch (IOException e) {e.printStackTrace();} finally {try {if (writer != null) writer.close();} catch (IOException e) {e.printStackTrace();}}

在活动销毁之前调用这个方法

把数据从文件取出:

openfileinput()只有一个参数就是文件名;思路构建inputstreamreader对象,构建buffedreader对象,最后利用readline读入;

代码如下:

 try {in = openFileInput(FILE_NAME);reader = new BufferedReader(new InputStreamReader(in));String line;while ((line = reader.readLine()) != null) {content.append(line).append("\n");}} catch (IOException e) {e.printStackTrace();} finally {try {if (reader != null) reader.close();} catch (IOException e) {e.printStackTrace();}}

根据例子新学到的知识:

editview的方法: settext方法可以把数据放到编辑框里;

setSelection(长度),定光标

TextUtils.isempty(字符串)判空

利用ShatedPreferenecs存储

 以上的实例总结是我个人的学习总结,各位可用于知识点的复习,如果不需要可跳过;

利用SharedPreferences中读取数据

SharedPreferences 是 Android 中专门用于 保存少量键值对数据的持久化方式,适合保存用户的配置信息、登录状态、设置项等;它本质上使用 XML 文件 存储数据,操作简单、高效、安全;

存入

有三种获得sharedpreferences的方法:

利用Context类中的方法:getSharedPreferences()方法;参数是文件名+类型只有(MODE——PRIVATE方法)

利用Activity类中的方法:getPrefereences()方法 参数只有类型,会把类名作为文件名

利用PreferenceManager类中的getDefaultSgatedPreferences()方法 参数只有context;

获取到sharedpreferences对象之后的做法

  1. New一个editor对象

  2. put数据

  3. apply()开启

代码示例如下:

SharedPreferences.Editor edit = getSharedPreferences("name",MODE_PRIVATE).edit();
edit.putInt("int",8);
edit.putBoolean("boolean",true);
edit.apply();

读取

  1. getshatedpreferences方法得到对象

  2. 通过get数据获取,参数有二,第一是键,第二是找不到以什么返回;

SharedPreferences preferences = getSharedPreferences("name",MODE_PRIVATE);
int q = preferences.getInt("int",0);
Log.d("ints","int is");

案例

学到这里,有一个关于密码记忆的案例:在登录界面,有一个选项,会将你这次登录成功的密码进行保存;那么我们一起来看看这个案例吧;

 在点击之后的逻辑是如果你点了,进行保存,如果没点,就调用clear方法

public void onClick(View view) {String s1 = a.getText().toString();String s2 = b.getText().toString();if(s1.equals("797923")&&s2.equals("2983")){edit  = pre.edit();if(f.isChecked()){edit.putString("zh",s2);edit.putString("mima",s1);edit.putBoolean("jy",true);}else{edit.clear();}edit.apply();Intent intent = new Intent(LoginActivity.this,MainActivity.class);startActivity(intent);finish();}
}

如果是初次登录,记得获取boolean的值的时候,第二个参数为false,必须要通过这个值我才能知道你当时有无选择复选框;,然后如果为true,那么就进行获取值,然后settext,也设置复选框:

protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);EdgeToEdge.enable(this);setContentView(R.layout.activity_login);ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main), (v, insets) -> {Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars());v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom);return insets;});pre = getSharedPreferences("wj",MODE_PRIVATE);button =(Button) findViewById(R.id.psss);a = (EditText) findViewById(R.id.password);b = (EditText) findViewById(R.id.accout);f= (CheckBox) findViewById(R.id.ck);boolean iff = pre.getBoolean("jy", false);if(iff){String c = pre.getString("zh","q");String d = pre.getString("mima","q");a.setText(d);b.setText(c);f.setChecked(true);}button.setOnClickListener(this);
}

SQLite创建数据库

SQLite 是 Android 中内置的数据库系统,适合存储中等规模、结构化的本地数据,支持标准 SQL 操作。

getWritableDatabase和getReadableDatabase方法有什么不同

getWritableDatabase和getReadableDatabase方法有什么不同: 前者,可度可写也可以查删,但是如果磁盘满了,写入会崩溃;后者:未满会返回可写数据库,但你不能写,写了可能崩溃,满了返回安全的可度数据库

一个类SQLiteOpenHelper是一个抽象类,想要创建数据库需要自定义一个类去继承,然后重写方法,创建表,把表的创建放进OnCreat里面,这样new对象的时候创建好数据库的时候,也可以创建好表:对象.execSQL(表名)

建表语句

好嘛,这里先介绍一下建表语句:

    public static final String CREATE_BOOK = "create table Book (" +"id integer primary key autoincrement,"+"author text,"+"price real," +"pages Integer," +"name text)";

CREATE_BOOK:表的语句名;

create table Book (:第一行这里:Book代表表名;

后面的行:第一个代表列名,第二个代表类型,这里给出类型

text   文本     real  浮点数   Integer  整数  blob 二进制

接下来看看怎么创建数据库把:

自定以类

建表,构造,重写方法;

public class MyDatabaseHelper extends SQLiteOpenHelper {private Context mycontext;public static final String CREATE_BOOK = "create table Book (" +"id integer primary key autoincrement,"+"author text,"+"price real," +"pages Integer," +"name text)";public MyDatabaseHelper(@Nullable Context context, @Nullable String name, @Nullable SQLiteDatabase.CursorFactory factory, int version) {super(context, name, factory, version);mycontext = context;}@Overridepublic void onCreate(SQLiteDatabase sqLiteDatabase) {sqLiteDatabase.execSQL(CREATE_BOOK);Toast.makeText(mycontext,"create yse",Toast.LENGTH_LONG).show();}@Overridepublic void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {}

创建对象,调用getweitabledatabase方法可以创建数据库;

public class MainActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);EdgeToEdge.enable(this);setContentView(R.layout.activity_main);ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main), (v, insets) -> {Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars());v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom);return insets;});MyDatabaseHelper mdh = new MyDatabaseHelper(this,"book.db",null,1);@SuppressLint({"MissingInflatedId", "LocalSuppress"}) Button a = (Button)findViewById(R.id.DT);a.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {mdh.getWritableDatabase();}});}
}

更新

如果你要更新,比如你要添加表,但是Oncreate只会在创建库的时候启动一次,这个时候删除程序不理智,在upgrade方法中,删除已经存在的表格(否则会报错).exec("drop table if exits 表名"),然后调用creat方法,最后在创建数据库对象时,改版本号;

@Override
public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {sqLiteDatabase.execSQL("drop table if exists BOOK");onCreate(sqLiteDatabase);
}

添加

得到SQiteDatabase对象之后,有一个添加方法:insert方法

三个参数,第一个表名,第二个Null不添加数据的情况下的一列可以为Null 为null,第三个参数传入的值

这里是一个对象ContentValues对象,这个对象的方法put(第一个参数是项,第二个参数是数据);

SQLiteDatabase aqd = mdh.getWritableDatabase();
ContentValues values = new ContentValues();
values.put("name","zh");
values.put("author","1");
values.put("pages",677);
values.put("price",90.8);
aqd.insert("BOOK",null,values);

删除

delete() 用于按条件删除表中数据,相信你立马就可以理解,这个代码是删除大于700页的行了

SQLiteDatabase aqd = mdh.getWritableDatabase();
aqd.delete("BOOK","pages > ?" ,new String[]{"700"});

查找:

通过query方法得到cursor方法,

通过getstring,

外层为行,内层确定列

我们可以看到有多个参数,很是难记,但我们一般就第一个参数写表名,后面参数全是null了

最近记得关闭

Cursor cr = mdh.getWritableDatabase().query("BOOK",null,null,null,null,null,null);
if(cr.moveToFirst()){do{Log.e("MainActivity","book page is");String names = cr.getString(cr.getColumnIndexOrThrow("name"));String author = cr.getString(cr.getColumnIndexOrThrow("author"));double jg = cr.getDouble(cr.getColumnIndexOrThrow("price"));int page = cr.getInt(cr.getColumnIndexOrThrow("pagesr"));Log.e("MainActivity","book name is"+names);Log.e("MainActivity","book page is"+page);}while(cr.moveToNext());
}
cr.close();

但我们是学习嘛,还是把其他参数也看看吧!

Cursor cursor = db.query("Book",                // 表名null,                  // 要查询的列(null 表示全部)"author = ?",          // 查询条件new String[]{"曹雪芹"}, // 条件参数null, null, null       // 分组、排序等
);

好啦,本次分享到此结束!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/90988.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/90988.shtml
英文地址,请注明出处:http://en.pswp.cn/bicheng/90988.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

并发安全之锁机制一

锁机制一 锁机制是计算机系统中解决并发冲突的核心工具,其存在和应用场景源于一个根本问题:当多个执行单元(线程、进程、分布式节点)同时访问或修改同一份共享资源时,如何保证数据的正确性、一致性和系统可靠性&#x…

结合项目阐述 设计模式:单例、工厂、观察者、代理

原文链接:https://download.csdn.net/blog/column/12433305/133862792#_1613 1、工厂模式应用 C17及之后可编译 /*日志落地模块的实现1.抽象落地基类2.派生子类(根据不同落地方向进行派生)3.使用工厂模式进行创建与表示的分离 */#ifndef _…

uniapp 更新apk有缓存点不动,卸载安装apk没有问题。android

方式一。pages.json:"globalStyle" : {"navigationBarTextStyle" : "black","navigationBarTitleText" : "uni-app","navigationBarBackgroundColor" : "#F8F8F8","backgroundColor&qu…

HTML响应式SEO公司网站源码

核心优势 100%纯HTML/CSS开发自动适配手机/平板/PC内置SEO优化结构0.5秒极速加载 包含页面 • 首页(关键词布局优化版) • 服务项目展示页 • 客户案例库 • 新闻资讯系统 • 联系方式(带地图API) 技术参数 兼容Chrome/Firefo…

Error: llama runner process has terminated: exit status 2

我是i7 12700h ,3080显卡,在 Windows 11 上运行 ollama run deepseek-r1:1.5b 出现 Error: llama runner process has terminated: exit status 2 之前是好用的,后来不知为什么就不好用了。 原因: 检查 Microsoft Visual C Redistributab…

Linux中ssh远程登录原理与配置

SSH连接的五个阶段 1. 版本协商阶段(Protocol Version Negotiation)目的:协商使用SSH-1或SSH-2协议(现代系统默认SSH-2)。流程:关键点:若版本不兼容(如客户端只支持SSH-1&#xff0c…

Kubernetes --存储入门

一、Volume 的概念对于大多数的项目而言,数据文件的存储是非常常见的需求,比如存储用户上传的头像、文件以及数据库的数据。在 Kubernetes 中,由于应用的部署具有高度的可扩展性和编排能力(不像传统架构部署在固定的位置&#xff…

蚂蚁 KAG 框架开源:知识图谱 + RAG 双引擎

引言:从RAG到KAG,专业领域知识服务的技术突破 在大语言模型(LLM)应用落地过程中,检索增强生成(RAG) 技术通过引入外部知识库有效缓解了模型幻觉问题,但在专业领域仍面临三大核心挑战…

V-Ray 7.00.08 for 3ds Max 2021-2026 安装与配置教程(含语言补丁)

本文介绍 V-Ray 7.00.08 渲染器在 3ds Max 2021-2026 各版本中的安装与使用配置步骤,适合需要进行可视化渲染工作的设计师、建筑师及相关从业者。附带语言补丁配置方式,帮助用户获得更顺畅的使用体验。 📁 一、安装文件准备 软件名称&#xf…

Go-Elasticsearch Typed Client查询请求的两种写法强类型 Request 与 Raw JSON

1 为什么需要两种写法? 在 Golang 项目中访问 Elasticsearch,一般会遇到两类需求:需求场景特点最佳写法后台服务 / 业务逻辑查询固定、字段清晰,需要编译期保障Request 结构体仪表盘 / 高级搜索 / 模板 DSL查询片段由前端或脚本动…

Leaflet 综合案例-聚类图层控制

看过的知识不等于学会。唯有用心总结、系统记录,并通过温故知新反复实践,才能真正掌握一二 作为一名摸爬滚打三年的前端开发,开源社区给了我饭碗,我也将所学的知识体系回馈给大家,助你少走弯路! OpenLayers…

React组件中的this指向问题

在 React 组件中,函数定义方式影响this指向的核心原因是箭头函数与普通函数的作用域绑定规则不同,具体差异如下:​ 1. 普通函数(function定义)需要手动bind(this)的原因​ 当用function在组件内定义方法时&#xff1…

Vue 项目中的组件引用如何实现,依赖组件间的数据功能交互及示例演示

在 Vue 项目中,组件间的引用与数据交互是核心功能之一。以下是组件引用和数据交互的详细实现方式及示例:一、组件引用方式 1. 基本组件引用 局部注册:在父组件中按需引入子组件并注册。 // ParentComponent.vue import ChildComponent from .…

✨ 使用 Flask 实现头像文件上传与加载功能

文章目录&#x1f9f1; 技术栈&#x1f5c2;️ 项目结构与配置&#x1f510; 用户身份校验逻辑&#x1f4e4; 头像上传接口&#xff1a;/file/avatar/upload&#x1f4e5; 加载头像接口&#xff1a;/file/avatar/load/<filename>&#x1f9ea; 示例请求&#xff08;使用 …

去除视频字幕 5: 使用 ProPainter, 记录探索过程

使用 ProPainter 去除视频上的字幕&#xff0c;效果演示&#xff08;比之前好多了。&#xff09;。 1. 项目目标 去除视频 (bear.webm) 中的硬字幕。 2. 初始尝试与关键失败&#xff1a;IOPaint 方法: 使用 IOPaint&#xff08;一个图像修复工具&#xff09;配合 PaddleOCR 逐…

JavaScript HTTP 请求:从老古董到新潮流

前端开发离不开跟后端打交道&#xff0c;HTTP 请求就是这座桥梁。JavaScript 提供了好几种方式来发请求&#xff0c;从老牌的 XMLHttpRequest (XHR) 到现代的 Fetch API&#xff0c;再到各种好用的第三方库&#xff08;像 Axios、Ky、Superagent&#xff09;。咱们一个一个聊清…

Windows10系统使用Cmake4.1.0构建工具+Visual Studio2022编译Opencv4.11教程

安装提示 后续安装本Cmake和Opencv版本及以上都可以。Microsoft Visual Studio2022已默认安装&#xff0c;没有安装给出教程链接。 一、Cmake4.1.0下载 1.官网下载&#xff1a;https://cmake.org/download/&#xff0c;找到cmake-4.1.0-rc3-windows-x86_64.zip版本 2.压缩包…

【性能测试】Jmeter+Grafana+InfluxDB+Prometheus Windows安装部署教程

一、工具作用与整体架构 1.1 各工具核心作用 工具作用描述关键特性Jmeter性能测试工具&#xff0c;模拟多用户并发请求&#xff0c;生成测试数据支持HTTP/HTTPS、数据库等多种协议&#xff0c;可自定义测试场景InfluxDB时序数据库&#xff0c;专门存储时间序列数据&#xff0…

【Kubernetes】使用Deployment进行的资源调度,资源清理,伸缩与更新管控

Kubernetes Deployment 实战&#xff1a;从资源清理到伸缩与更新管控 一、基础准备&#xff1a;清理闲置 ReplicaSet 在使用 Deployment 时&#xff0c;每次更新都会生成新的 ReplicaSet&#xff08;简称 RS&#xff09;&#xff0c;旧的 RS 会被保留但设置为 DESIRED0。这些闲…

stm32使用USB虚拟串口,因电脑缺少官方驱动而识别失败(全系列32单片机可用)

驱动下载地址 官网地址&#xff1a;https://www.st.com/en/development-tools/stsw-stm32102.html