数据存储-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.hqwc.cn/news/681085.html

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

相关文章

PY计算生态是什么?

Python 的计算生态指的是与 Python 相关的广泛的软件、库、框架和工具集合. 它们为各种计算任务提供了丰富的解决方案和支持。Python 作为一种简洁、易学、功能强大的编程语言&#xff0c;在科学计算、数据分析、人工智能、机器学习等领域都有着强大的影响力。以下是 Python 计…

利用组合数进行幂集索引

在计算机科学中&#xff0c;通常使用二进制表示来表示子集的包含情况。如果集合中有n个元素&#xff0c;那么幂集的大小为2^n。考虑一个集合{a, b, c}&#xff0c;其幂集为{{}, {a}, {b}, {c}, {a, b}, {a, c}, {b, c}, {a, b, c}}。每个子集都可以用二进制数来表示&#xff0c…

每日两题 / 104. 二叉树的最大深度 102. 二叉树的层序遍历(LeetCode热题100)

104. 二叉树的最大深度 - 力扣&#xff08;LeetCode&#xff09; 递归判断&#xff0c;当前节点的最大深度为1 max(左节点的最大深度&#xff0c;右节点的最大深度) /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* …

回答篇:测试开发高频面试题目

引用之前文章&#xff1a;《测试开发高频面试题目》 https://blog.csdn.net/qq_41214208/article/details/138193469?spm1001.2014.3001.5502 本篇文章是回答篇&#xff08;持续更新中&#xff09; 1. 什么是测试开发以及其在软件开发流程中的作用。 a. 测试开发是指测试人员或…

Web LLM 攻击实验:利用 LLM API 实现 SQL 注入

前言 Web LLM 攻击 各组织都在急于集成大型语言模型 (LLM)&#xff0c;以改善其在线客户体验。这使他们面临 Web LLM 攻击&#xff0c;这些攻击利用模型对攻击者无法直接访问的数据、API 或用户信息的访问权限。例如&#xff0c;攻击可能&#xff1a; 检索 LLM 有权访问的数…

Android 查看CUP占用率

查看每个进程CUP占用率的几种方式,由于自己充电界面老是导致整机温度过高&#xff0c;后面发现自己的线程一直在跑&#xff0c;相当于死循环&#xff0c;后面加上sleep才得以改善&#xff1b;先看看几种查询方式吧。 1、adb shell top 2、adb shell busybox top 3、adb shell …

美易官方:收盘美股涨跌不一,道指连续第6日收高

收盘之际&#xff0c;美股市场呈现出涨跌不一的态势&#xff0c;道指连续第6日收高&#xff0c;这无疑为投资者带来了一定的市场信心。然而&#xff0c;这种信心似乎并不稳固&#xff0c;因为市场的波动性和不确定性仍然存在。 美股周三收盘涨跌不一&#xff0c;道指连续第6个交…

Oracle数据库如何插入平方(²)立方(³)字符

第一步&#xff1a;创建数据表&#xff0c;字段一定要是NVARCHAR2类型的 第二步&#xff0c;插入数据用 unistr(1\00b3) 形式的写法 00b3 代表m&#xff0c;00b2代表㎡ SELECT * FROM TESTABC; UPDATE TESTABC set NAME1unistr(1\00b3); UPDATE TESTABC set NAME2unistr(2\00b2…

Mysql 8.0.33 迁移至 Postgresql 16.2

小伙伴们&#xff0c;你们好&#xff0c;我是老寇&#xff0c;我又回来&#xff0c;几个月不见&#xff0c;甚是想念啊&#xff01;&#xff01;&#xff01;&#xff01; 这不&#xff0c;云平台需要改造&#xff0c;将Mysql替换成Postgresql&#xff0c;话说回来&#xff0c…

日本站群服务器备受推崇:稳定性、性能、安全性超卓!

日本站群服务器备受推崇&#xff1a;稳定性、性能、安全性超卓! 在创建和运营网站的过程中&#xff0c;选择适合的服务器托管服务至关重要。日本站群服务器以其出色的稳定性、性能和安全性备受推崇。这篇文章将介绍日本站群服务器的优势&#xff0c;以及为何许多网站所有者和开…

【算法】-- 二分查找详注

引入 二分查找&#xff0c;也称为折半查找&#xff1b;首先&#xff0c;二分查找是一种基于有序数组中查找特定元素的算法&#xff0c;所以它会因为数组的一些特性而受限。它的工作原理是不断将要查找的区间分成两部分&#xff0c;然后确定目标值可能存在的区间&#xff0c;直…

程序员不会告诉老板的那些神器

目录 1. 持续集成工具&#xff1a;CruiseControl&#xff08;简称CC&#xff09; 2. 代码风格、质量检查工具&#xff1a;StyleCop 3.AI工具 3.1 AI助力编写开发日报 3.2 AI助力编写普适性代码 3.3 AI助力生成代码注释 3.4 AI助力重构代码去掉“坏味道” 3.5 AI助力…