数据存储-SQLite

  一般使用到数据库存储,涉及到的数据量都较大,采用文件存储也能完成,但是文件操作复杂,效率低,大量结构化数据通常采用关系型数据库存储较为合适。Android中已经嵌入了轻量级的关系型数据库SQLite,直接按照数据库操作,实现增删改查即可。如果你想要完成一个简单增删改查作品,可以使用:UI设计+页面跳转+对话框+数据库技术架构。

  数据库操作一般分为两个步骤:创建数据库,接下来写SQL语句,执行并查看结果,常见操作为:增删改查。

第1步:配置权限(主要是因为API版本可能不同,配置一下权限较好,高版本都无需配置,我测试使用的是API34,所以我没有配置)

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

第2步:设计布局

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"tools:context=".MainActivity"><LinearLayoutandroid: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="match_parent"android:layout_height="wrap_content"android:hint="请输入用户名" /></LinearLayout><LinearLayoutandroid: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/pwd"android:layout_width="match_parent"android:layout_height="wrap_content"android:hint="请输入密码" /></LinearLayout><Buttonandroid:id="@+id/add"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="增加" /><Buttonandroid:id="@+id/delete"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="删除" /><Buttonandroid:id="@+id/update"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="修改" /><Buttonandroid:id="@+id/query"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="查询" /></LinearLayout>

设计图效果:

增加操作:输入用户名和密码,点击增加,往数据库中添加一条数据。

删除操作:根据用户输入的用户名,删除一条数据。(注:当然,如果不存在,删除肯定会失败,这些处理我就没有关注了,案例主要想表达的是能删除,如果需要做的精致或者实际开发中用到,请务必考虑周全)

修改操作:根据用户输入的用户名来更新密码,所以此时输入的密码,相当于是覆盖旧值。

查询操作:将表中的数据全部查出,并显示即可(实际开发中,结合ListView+ArrayAdapter效果更佳)

第3步:请求权限,并获得授权后,创建数据库。(如果你没有配置权限,则这一步都可以跳过了)

具体操作:在onCreate回调方法中动态请求权限,授权成功后,创建数据库

 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {requestPermissions(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1);File file = new File("data/data/com.yibinu.sqlitedemo/testdb.db3");Log.i("目录", "onCreate: " + file);if (file.exists() && !file.isDirectory()) {sqLiteDatabase = SQLiteDatabase.openOrCreateDatabase(file, null);String sql = "create table testdb(username varchar(10),pwd varchar(6))";sqLiteDatabase.execSQL(sql);} else {Log.i("===============", "onCreate: 文件不存在");}}

如果你在测试时,创建失败,还可以去指定目录位置手动创建文件testdb.db3

由于我的测试版本较高,就没有去写授权,直接使用

第4步:逻辑文件

package com.yibinu.sqlitedemo;import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;import android.Manifest;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Build;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;import java.io.File;public class MainActivity extends AppCompatActivity implements View.OnClickListener {Button add;Button delete;Button update;Button query;EditText username;EditText pwd;SQLiteDatabase sqLiteDatabase = null;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);add = findViewById(R.id.add);delete = findViewById(R.id.delete);update = findViewById(R.id.update);query = findViewById(R.id.query);username = findViewById(R.id.username);pwd = findViewById(R.id.pwd);delete.setOnClickListener(this);add.setOnClickListener(this);update.setOnClickListener(this);query.setOnClickListener(this);File file = new File("data/data/com.yibinu.sqlitedemo/testdb.db3");Log.i("目录", "onCreate: " + file);if (file.exists() && !file.isDirectory()) {sqLiteDatabase = SQLiteDatabase.openOrCreateDatabase(file, null);String sql = "create table testdb(username varchar(10),pwd varchar(6))";sqLiteDatabase.execSQL(sql);} else {Log.i("===============", "onCreate: 文件不存在");}}@Overridepublic void onClick(View v) {int id = v.getId();if (id == R.id.add) {String userName = username.getText().toString().trim();String pWD = pwd.getText().toString().trim();String addSql = "insert into testdb(username,pwd) values(?,?);";sqLiteDatabase.execSQL(addSql, new String[]{userName, pWD});Toast.makeText(this, "插入数据成功", Toast.LENGTH_SHORT).show();} else if (id == R.id.delete) {String delUserName = username.getText().toString().trim();String deleteSql = "delete from testdb where username=?";sqLiteDatabase.execSQL(deleteSql, new String[]{delUserName});Toast.makeText(this, "删除数据成功", Toast.LENGTH_SHORT).show();} else if (id == R.id.update) {String newUserName = username.getText().toString().trim();String pWDD = pwd.getText().toString().trim();String updateSql = "update testdb set pwd=? where username = ?";sqLiteDatabase.execSQL(updateSql, new String[]{pWDD, newUserName});Toast.makeText(this, "更新数据成功", Toast.LENGTH_SHORT).show();} else if (id == R.id.query) {String queryDateSql = "select * from testdb";Cursor cursor = sqLiteDatabase.rawQuery(queryDateSql, null);while (cursor.moveToNext()) {String myname = cursor.getString(0);String mypwd = cursor.getString(1);Log.i("【查询结果】", "姓名:" + myname + "密码:" + mypwd);}Toast.makeText(this, "查询成功,请查看日志", Toast.LENGTH_SHORT).show();}}
}

效果

运行成功后,出现主界面

接下来看动态演示

SQLite效果

核心技术:

SQLiteDatabase类,通过该类对象,可以执行SQL语句,具体操作,通过openOrCreateDatabase方法,创建一个数据库对象,需要两个参数

public static SQLiteDatabase openOrCreateDatabase(@NonNull File file,@Nullable CursorFactory factory) 
  1. 数据库名
  2. 游标工厂

当然,一般方法和构造方法都可以重载,所以如果你看到有多个参数,也可以查看一下原型,就可以直接使用了。

接下来就通过数据库对象,执行SQL语句,核心方法是:

public void execSQL(String sql, Object[] bindArgs)
  1. SQL语句
  2. 参数

看个添加一行数据的案例

String userName = username.getText().toString().trim();
String pWD = pwd.getText().toString().trim();
String addSql = "insert into testdb(username,pwd) values(?,?);";
sqLiteDatabase.execSQL(addSql, new String[]{userName, pWD});

前两行,获取用户输入的用户名和密码,第3行,构造一个SQL语句,如果有参数,就使用?占位置,第4行,执行SQL语句,由于有参数,所以要把真实的数据去替换?所占据的位置。如果没有参数,就写为null,执行结束后,数据库中就已经添加上该条数据了。

修改和删除是一样的道理,查询要复杂一点,它的复杂在于,数据库的主要功能就是查询,查询结果通常是多行数据,就需要使用到游标(如果你会Oracle数据库操作,游标就非常简单了)

查询可以是带参的,也可以是不带参数的

String queryDateSql = "select * from testdb";Cursor cursor = sqLiteDatabase.rawQuery(queryDateSql, null);while (cursor.moveToNext()) {String myname = cursor.getString(0);String mypwd = cursor.getString(1);Log.i("【查询结果】", "姓名:" + myname + "密码:" + mypwd);}

游标可以简单理解为指向这个结果集,第一次移动,则来到第一行,再移动一次,就来到第二行

所以只要移动后,数据不为空,则表示移动后的位置是有一条数据的,就可以获取到对应的值

移动主要依靠moveToNext方法,读取对应的值,则使用getXXX方法

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

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

相关文章

信号处理SCI期刊,中科院2区,专业性强,审稿速度快!

一、期刊名称 Signal Processing 二、期刊简介概况 期刊类型&#xff1a;SCI 学科领域&#xff1a;信号处理 影响因子&#xff1a;4.4 中科院分区&#xff1a;2区 出版方式&#xff1a;订阅模式/开放出版 版面费&#xff1a;选择开放出版需支付$3300 三、期刊征稿范围 …

信创基础软件之中间件

信创基础软件之中间件 中间件概述 中间件是一种应用于分布式系统的基础软件&#xff0c;位于应用与操作系统、数据库之间&#xff0c;主要用于解决分布式环境下数据传输、数据访问、应用调度、系统构建和系统集成、流程管理等问题&#xff0c;是分布式环境下支撑应用开发、运…

【多客开源】游戏陪玩系统,游戏陪玩源码,游戏陪玩语音社交源码运营版游戏陪玩平台源码/tt语音聊天/声优服务/陪玩系统源码开黑/约玩源码

介绍 我们针对陪玩app源码市场的发展趋势&#xff0c;整合市面上主流陪玩app应用功能&#xff0c;自主开发了多客陪玩系统源码&#xff0c;并可为客户提供全部原生陪玩源码&#xff0c;进行二次开发&#xff0c;打造适用于线上游戏陪玩、语音聊天、心理咨询、情感陪伴等业务场…

26 | 备库为什么会延迟好几个小时?

在官方的 5.6 版本之前,MySQL 只支持单线程复制,由此在主库并发高、TPS 高时就会出现严重的主备延迟问题。 coordinator 就是原来的 sql_thread, 不过现在它不再直接更新数据了,只负责读取中转日志和分发事务。真正更新日志的,变成了 worker 线程。而 work 线程的个数,就是…

Macbook pnpm 安装 node-sass 报错(node-gyp)

换了 Macbook M3 Pro 后安装项目依赖时报错&#xff0c;提示 node-sass 安装出错。 &#xff08;此外&#xff0c;ValueError: invalid mode: rU while trying to load binding.gyp 也是类似原因。只需要确保 node-gyp 运行条件就可以&#xff09; 原因是 node-gyp 运行环境缺…

IntelliJ IDEA安装教程

IntelliJ IDEA-安装 解锁编程新境界&#xff0c;IntelliJ IDEA —— Java开发者梦寐以求的智慧之选&#xff01; 在代码的海洋里航行&#xff0c;你需要的不仅仅是一艘船&#xff0c;而是一位智勇双全的领航员。IntelliJ IDEA&#xff0c;这款被全球数百万程序员热烈追捧的Ja…

JAVA(三)常用类和API

目录 常用类与基础API---String String的内存结构 构造器和常用方法 字符串构建 String与其他结构间的转换 String的常用API 系列1&#xff1a;常用方法 系列2&#xff1a;查找 系列3&#xff1a;字符串截取 系列4&#xff1a;和字符/字符数组相关 系列5&#xff1a;开头…

数据库加密数据模糊匹配查询技术方案

文章目录 前言沙雕方案内存加载解密密文映射表 常规做法实现数据库加密算法参考 分词组合加密&#xff08;推荐&#xff09; 超神方案总结个人简介 前言 在数据安全性和查询效率之间找到平衡是许多数据管理系统所面临的挑战之一。特别是在涉及加密数据的情况下&#xff0c;如何…

vue3+ts--实际开发之--table表格打印或者保存

vue3实现指定区域打印&#xff08;导出&#xff09;功能-主要是解决分页内容分割问题 一、 问题页面效果二、 Print.js相关属性 和使用1. 介绍2. 安装引入3. PrintJS参数配置表 三 、解决关于分页文字或者表格被分割问题&#xff0c;解决后如下&#xff1a;1. 设置一个自定义ta…

c4d云渲染怎么操作?怎么使用?一文带你了解

Cinema 4D (C4D) 不仅是众多设计师所青睐的卓越三维软件&#xff0c;其自带的高效渲染器以及对云渲染农场的支持&#xff0c;都极大地拓宽了创意和生产的边界。通过利用强大的云计算资源&#xff0c;C4D能够帮助用户轻松克服渲染速度缓慢的难题&#xff0c;从而实现更加流畅和高…

新一代异步IO框架 io_uring

1.io_uring简介 io_uring是一个Linux内核的异步I/O框架&#xff0c;它提供了高性能的异步I/O操作&#xff0c;io_uring的目标是通过减少系统调用和上下文切换的开销来提高I/O操作的性能。 io_uring通过使用环形缓冲区和事件驱动的方式来实现高效的异步I/O操作。 io_uring的设…

ai直播-智能化视频直播-全程自动学,高效互动问答!

ai直播-智能化视频直播-全程自动学&#xff0c;高效互动问答&#xff01; 普通人想要致富&#xff0c;光靠勤劳是不可能的&#xff0c;唯有抓住时代风口&#xff0c;才能铸造成功之路。 大家都知道&#xff0c;现在最赚钱的行业&#xff0c;直播和卖货&#xff0c;肯定是名列…

Codigger:Web应用让开发者拥有更高效的开发之旅

在当今软件开发领域&#xff0c;Web应用以其跨平台、易访问和实时更新的特性&#xff0c;逐渐成为了主流的开发方向。从开发者的视角来看&#xff0c;Codigger借助B/S&#xff08;浏览器/服务器&#xff09;架构和云计算技术&#xff0c;为开发者带来了诸多便利和优势。这些优势…

苏州金龙何以成为塞尔维亚中国客车第一品牌?研发向上服务助力!

5月7日至8日&#xff0c;一场举世瞩目的会晤在塞尔维亚举行。作为塞尔维亚中国客车第一品牌&#xff0c;苏州金龙海格客车也为当地民众绿色公共出行提供了“中国力量”。 目前&#xff0c;苏州金龙海格客车在塞尔维亚保有量近200台&#xff0c;是在塞尔维亚保有量最大的中国客车…

Linux系统入侵排查(二)

前言 为什么要做系统入侵排查 入侵排查1 1.排查历史命令记录 2.可疑端口排查 3.可疑进程排查 4.开机启动项 4.1系统运行级别示意图&#xff1a; 4.2查看运行级别命令 4.3系统默认允许级别 4.4.开机启动配置文件 入侵排查2&#xff1a; 1.启动项文件排查&#xff1…

友思特分享 | 激发专属跃迁:用于皮肤医美和光学研究种子源的DPSS激光器

导读 紧凑、坚固、稳定和提供高质量光束的友思特DPSS激光器因其卓越的性能&#xff0c;可作为激光种子源&#xff0c;广泛应用于皮肤医美、非线性光学OPO&#xff0c;以及全息投影技术。 激光&#xff08;Laser&#xff09;的诞生是上个世纪科学技术的巨大飞跃&#xff0c;其发…

大语言模型入门介绍(附赠书)

自2022年底ChatGPT的震撼上线以来&#xff0c;大语言模型技术迅速在学术界和工业界引起了广泛关注&#xff0c;标志着人工智能技术的又一次重要跃进。作为当前人工智能领域的前沿技术之一&#xff0c;代表了机器学习模型在规模和复杂性上的显著进步。它们通常由深度神经网络构成…

C++进阶之路:何为命名空间、缺省参数与函数重载

✨✨ 欢迎大家来访Srlua的博文&#xff08;づ&#xffe3;3&#xffe3;&#xff09;づ╭❤&#xff5e;✨✨ &#x1f31f;&#x1f31f; 欢迎各位亲爱的读者&#xff0c;感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢&#xff0c;在这里我会分享我的知识和经验。&am…

如何修复连接失败出现的错误651?这里提供修复方法

错误651消息在Windows 7到Windows 11上很常见&#xff0c;通常会出现在一个小的弹出窗口中。实际文本略有不同&#xff0c;具体取决于连接问题的原因&#xff0c;但始终包括文本“错误651”。 虽然很烦人&#xff0c;但错误651是一个相对较小的问题&#xff0c;不应该导致计算…

C#调用电脑摄像头拍照

1.打开VS2019&#xff0c;新建一个Form窗体&#xff0c;工具->NuGet包管理工具->管理解决方案的NuGet包&#xff0c;在浏览里搜索AForge.Controls、AForge.Video.DirectShow&#xff0c;安装AForge.Controls和AForge.Video.DirectShow 2.安装AForge组件完成后&#xff0c…