SQLiteOpenHelper数据库帮助器
SQLiteOpenHelper数据库帮助器是Android提供的数据库辅助工具。
1、继承SQLiteOpenHelper类,需要重写onCreate和onUpgrade两个方法
案例:实现增删改查
package com.example.databases_text;import android.app.PictureInPictureParams;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.res.Configuration;
import android.os.Bundle;
import android.text.TextUtils;
import android.util.Log;
import android.util.Rational;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;import androidx.appcompat.app.AppCompatActivity;import com.example.databases_text.R;import java.util.List;public class MainActivity extends AppCompatActivity implements View.OnClickListener{private EditText edit_name;private EditText edit_password;private UserDBHelper mUserDBHelper;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);edit_name=findViewById(R.id.et_name);edit_password=findViewById(R.id.et_pws);findViewById(R.id.btn_add).setOnClickListener(this);findViewById(R.id.btn_del).setOnClickListener(this);findViewById(R.id.btn_update).setOnClickListener(this);findViewById(R.id.btn_query).setOnClickListener(this);}@Overrideprotected void onStart() {super.onStart();//获得数据库帮助器实例mUserDBHelper = UserDBHelper.getInstance(this);mUserDBHelper.openWriteLink();//打开数据库mUserDBHelper.openReadLink();}@Overrideprotected void onDestroy() {super.onDestroy();}@Overridepublic void onClick(View view) {User user = new User();String name=edit_name.getText().toString();String psw=edit_password.getText().toString();switch (view.getId()){case R.id.btn_add:user.setName(name);user.setPassword(psw);if( mUserDBHelper.InsertData(user)>0)Toast.makeText(this,"添加成功", Toast.LENGTH_SHORT).show();break;case R.id.btn_del:user.setName(name);user.setPassword(psw);if( mUserDBHelper.deleteData(user)>0)Toast.makeText(this,"删除成功", Toast.LENGTH_SHORT).show();break;case R.id.btn_update:user.setName(name);user.setPassword(psw);if( mUserDBHelper.updateData(user)>0)Toast.makeText(this,"修改成功", Toast.LENGTH_SHORT).show();break;case R.id.btn_query:List<User> userList=mUserDBHelper.queryData(name);if(userList !=null){edit_password.setText(userList.get(0).getPassword());//userList.get(x).getPassword()表示查询第几个的密码Toast.makeText(this,"查询成功", Toast.LENGTH_SHORT).show();}break;}}
}
package com.example.databases_text;public class User {private String name;private String password;public User() {}public User(String name, String password) {this.name = name;this.password = password;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}@Overridepublic String toString() {return "User{" +"name='" + name + '\'' +", password='" + password + '\'' +'}';}
}
package com.example.databases_text;import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;import java.util.ArrayList;
import java.util.List;public class UserDBHelper extends SQLiteOpenHelper {// 数据库版本号public static final int DATABASE_VERSION = 1;// 数据库名称public static final String DATABASE_NAME = "User.db";public static final String DATABASE_table_name = "uer_table";// 用户表名public static final String TABLE_NAME = "user";// 用户名public static final String COLUMN_NAME = "name";// 用户密码public static final String COLUMN_PASSWORD = "password";private static UserDBHelper instance=null;private SQLiteDatabase mRDB=null;private SQLiteDatabase mWDB=null;public UserDBHelper( Context context) {super(context, DATABASE_NAME, null, DATABASE_VERSION);}//利用单例模式,获取数据库的唯一实例,当数据库不存在的时候,经行创建,如果已存在就直接返回public static UserDBHelper getInstance(Context context){if(instance==null){instance=new UserDBHelper(context);}return instance;}//打开数据库的读连接public SQLiteDatabase openReadLink(){if(mRDB==null || !mRDB.isOpen()) {mRDB = instance.getReadableDatabase();}return mRDB;}//打开数据库的写连接public SQLiteDatabase openWriteLink(){if(mWDB==null || !mWDB.isOpen()) {mWDB = instance.getReadableDatabase();}return mWDB;}//数据库的关闭操作public void closeLink() {if (mRDB != null && mRDB.isOpen()) {mRDB.close();mRDB = null;}if (mWDB != null && mWDB.isOpen()) {mWDB.close();mWDB = null;//置为空为了回收}}//创建数据库,执行sql语句@Overridepublic void onCreate(SQLiteDatabase sqLiteDatabase) {String sql = "create table " + TABLE_NAME + " (" + COLUMN_NAME + " text, " + COLUMN_PASSWORD+ " text)";sqLiteDatabase.execSQL(sql);}@Overridepublic void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {}//添加数据到数据库public long InsertData(User user){ContentValues values = new ContentValues();values.put("name", user.getName());values.put("password", user.getPassword());return mWDB.insert(TABLE_NAME,null,values);}public long deleteData(User user){//删除所有的return mWDB.delete(TABLE_NAME,"name=? and password=?",new String[]{user.getName(),user.getPassword()});}public long updateData(User user){ContentValues values = new ContentValues();values.put("name", user.getName());values.put("password", user.getPassword());//更改所有符合条件的数据return mWDB.update(TABLE_NAME,values,"name=? ",new String[]{user.getName()});}public List<User> queryData(String name){List<User> list = new ArrayList<>();//查询所有数据,得到游标Cursor cursor =mWDB.query(TABLE_NAME,null,"name=? ",new String[]{name},null,null,null);//逐个取出游标指向的数据while (cursor.moveToNext()){User user1=new User();user1.setName(cursor.getString(0));user1.setPassword(cursor.getString(1));list.add(user1);}return list;}}
<?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"tools:context=".MainActivity"android:orientation="vertical"><TextViewandroid:layout_width="match_parent"android:layout_height="wrap_content"android:text="用户名"/><EditTextandroid:id="@+id/et_name"android:layout_width="match_parent"android:layout_height="wrap_content"/><TextViewandroid:layout_width="match_parent"android:layout_height="wrap_content"android:text="密码"/><EditTextandroid:id="@+id/et_pws"android:layout_width="match_parent"android:layout_height="wrap_content"/><Buttonandroid:layout_width="match_parent"android:layout_height="wrap_content"android:id="@+id/btn_add"android:text="添加"/><Buttonandroid:layout_width="match_parent"android:layout_height="wrap_content"android:id="@+id/btn_del"android:text="删除"/><Buttonandroid:layout_width="match_parent"android:layout_height="wrap_content"android:id="@+id/btn_update"android:text="修改"/><Buttonandroid:layout_width="match_parent"android:layout_height="wrap_content"android:id="@+id/btn_query"android:text="查询"/>
</LinearLayout>
2、onUpgrade()是在数据库版本更新时,执行操作。
相关文章:

SQLiteOpenHelper数据库帮助器
SQLiteOpenHelper数据库帮助器是Android提供的数据库辅助工具。 1、继承SQLiteOpenHelper类,需要重写onCreate和onUpgrade两个方法 案例:实现增删改查 package com.example.databases_text;import android.app.PictureInPictureParams; import androi…...

2024年5月26日 (周日) 叶子游戏新闻
资深开发者:3A游戏当前处于一种尴尬的中间地带游戏行业整体,尤其是3A游戏正处于艰难时期。尽管2023年3A游戏佳作频出,广受好评,但居高不下的游戏开发成本(传闻《漫威蜘蛛侠2》的制作成本高达3亿美元)正严重…...

STM32-10-定时器
STM32-01-认识单片机 STM32-02-基础知识 STM32-03-HAL库 STM32-04-时钟树 STM32-05-SYSTEM文件夹 STM32-06-GPIO STM32-07-外部中断 STM32-08-串口 STM32-09-IWDG和WWDG 文章目录 一、STM32 基础定时器1. 基本定时器简介2. 基本定时器框图3. 基本定时器相关寄存器4. 定时器溢出…...
今天说的什么好呢
先这样吧...

计算机网络-Traffic-Filter流量过滤策略
一、概述 为提高网络安全性,管理人员需要控制进入网络的流量,将不信任的报文丢弃在网络边界。所谓的不信任报文是指对用户来说存在安全隐患或者不愿意接收的报文。同时保证数据访问安全性,企业网络中经常会要求一些部门之间不能相互访问。 背…...

小白入职 必要熟悉 Git / tortoiseGit 工具
1.安装Git 1.1 了解Git Git是分布式版本控制系统,没有中央服务器的每个人的电脑就是一个完整的版本库,工作时无需联网可多人协作,只需把各自的修改推送给对方,就可以互相看到对方的修改了 分布式版本控制工具管理方式ÿ…...

春秋CVE-2022-23906
简介 CMS Made Simple v2.2.15 被发现包含通过上传图片功能的远程命令执行 (RCE) 漏洞。此漏洞通过精心制作的图像文件被利用。 正文 1.进入靶场2.进入登录界面,弱口令admin/123456 3.进入后台,文件上传点 4.上传一句话木马图片 5.复制图片…...

JavaFX安装与使用
前言 最近学习了javafx,开始时在配置环境和导包时遇到了一些麻烦,关于网上很多方法都尝试过了,现在问题都解决了,和大家分享一下我是怎么实现javafx的配置,希望大家可以通过这个方法实现自己的环境配置! 🙈个人主页: 心.c 🔥文章专题:javafx Ὁ…...

漫画|基于SprinBoot+vue的漫画网站(源码+数据库+文档)
漫画网站 目录 基于SprinBootvue的漫画网站 一、前言 二、系统设计 三、系统功能设计 1系统功能模块 2管理员功能模块 3用户功能模块 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取: 博主介绍:✌️大…...
python-项目实战
项目实战 1.外星人入侵小游戏 2.数据可视化 3.web应用开发 一、外星人入侵小游戏 需求: 开发大型项目时,做好规划后再动手编写项目很重要。规划可确保你不偏离轨道,从而提高项目成功的可能性。 在游戏《外星人入侵》中,玩家控制着一艘最…...
单片机原理及技术(一)—— 认识单片机(C51编程)
目录 一、单片机概述 1.1 什么是单片机 1.2 单片机的发展历史 1.3 单片机的特点 1.4 MCS-51 系列与 AT89S5x 系列单片机 1.4.1 MCS-51 系列单片机 1.4.2 AT89S5x 系列单片机 1.5 各种衍生品种的8051单片机 1.5.1 STC 系列单片机 1.5.2 C8051Fxxx 系列单片机 一、单片…...

白嫖的在线工具类宝藏网站清单,快点击进来收藏一波
简单整理了一下自己日常经常使用的10个免费工具网站,建议点赞关注收藏,快点分享给小伙伴们! 1.奶牛快传:用户体验更好的网盘工具。 https://cowtransfer.com/ 今年开始使用的一款网盘工具,和百度网盘类似,叫奶牛快传,如…...
【机器学习300问】97、机器学习中哪些是凸优化问题,哪些是非凸优化问题?
在机器学习的领域中,多数模型的参数估计问题实质上可以转化为优化问题。鉴于机器学习模型的多样性,不同的模型会对应着不同的损失函数,进而形成各具特色的优化问题。了解优化问题的形式和特点,对于提升我们求解模型参数的效率和准…...
两种盒模型
在CSS中,有两种主要的盒模型(Box Model),它们决定了元素的尺寸计算方式: 标准盒模型(W3C Box Model) 在标准盒模型中,元素的总宽度和总高度分别由以下几个部分组成: Cont…...

【C++】类型转换
目录 前言一、C语言中的类型转换二、为什么C需要四种类型转换三、C强制类型转换3.1 static_cast3.2 reinterpret_cast3.3 const_cast3.4 dynamic_cast3.5 RTTI 前言 本篇文章讲解的是C中对于C语言类型转换做出的一些更好的规范问题,同时也保证了在一些特殊场景下进…...
Redis RDB 持久化问题
前言 Redis 是内存数据库,它将自己的数据储存在内存里面,如果不想办法将储存在内存中的数据保存到磁盘里面,那么一旦服务器进程退出,服务器中的数据也就没了。 因此,Redis 提供了 RDB 持久化功能,这个功能…...
windows 下nginx常用命令
1、启动,目录cmd,后 start nginx.exe 2.重新加载 nginx -s reload 3.查看状态 tasklist /fi “imagename eq nginx.exe” 4.关闭 nginx -s quit...
xjoi题库一级1-10段题解(c语言版)
xjoi题库一级一段 xjoi题库一级二段 xjoi题库一级三段 xjoi题库一级四段 xjoi题库一级五段...

1.int 与 Integer 的简单区别
蓝桥杯刷题从此开始: 第一题就是两个数的和,个人看来主要考察 int与integer 的区别; 这是我提交的答案,竟然会报错: import java.util.*; //输入A、B,输出AB。 class add {public static void main(String …...

单片机原理及技术(二)—— AT89S51单片机(一)(C51编程)
目录 一、AT89S51单片机的片内硬件结构 二、AT89S51的引脚功能 2.1 电源及时钟引脚 2.2 控制引脚 2.3 并行 I/O口引脚 三、AT89S51的CPU 3.1 运算器 3.1.1 算术逻辑单元(ALU) 3.1.2 累加器A 3.1.3 程序状态字寄存器(PSW)…...

SpringBoot-17-MyBatis动态SQL标签之常用标签
文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…...

shell脚本--常见案例
1、自动备份文件或目录 2、批量重命名文件 3、查找并删除指定名称的文件: 4、批量删除文件 5、查找并替换文件内容 6、批量创建文件 7、创建文件夹并移动文件 8、在文件夹中查找文件...
oracle与MySQL数据库之间数据同步的技术要点
Oracle与MySQL数据库之间的数据同步是一个涉及多个技术要点的复杂任务。由于Oracle和MySQL的架构差异,它们的数据同步要求既要保持数据的准确性和一致性,又要处理好性能问题。以下是一些主要的技术要点: 数据结构差异 数据类型差异ÿ…...
linux 错误码总结
1,错误码的概念与作用 在Linux系统中,错误码是系统调用或库函数在执行失败时返回的特定数值,用于指示具体的错误类型。这些错误码通过全局变量errno来存储和传递,errno由操作系统维护,保存最近一次发生的错误信息。值得注意的是,errno的值在每次系统调用或函数调用失败时…...

处理vxe-table 表尾数据是单独一个接口,表格tableData数据更新后,需要点击两下,表尾才是正确的
修改bug思路: 分别把 tabledata 和 表尾相关数据 console.log() 发现 更新数据先后顺序不对 settimeout延迟查询表格接口 ——测试可行 升级↑:async await 等接口返回后再开始下一个接口查询 ________________________________________________________…...

MFC 抛体运动模拟:常见问题解决与界面美化
在 MFC 中开发抛体运动模拟程序时,我们常遇到 轨迹残留、无效刷新、视觉单调、物理逻辑瑕疵 等问题。本文将针对这些痛点,详细解析原因并提供解决方案,同时兼顾界面美化,让模拟效果更专业、更高效。 问题一:历史轨迹与小球残影残留 现象 小球运动后,历史位置的 “残影”…...
云原生周刊:k0s 成为 CNCF 沙箱项目
开源项目推荐 HAMi HAMi(原名 k8s‑vGPU‑scheduler)是一款 CNCF Sandbox 级别的开源 K8s 中间件,通过虚拟化 GPU/NPU 等异构设备并支持内存、计算核心时间片隔离及共享调度,为容器提供统一接口,实现细粒度资源配额…...
面试高频问题
文章目录 🚀 消息队列核心技术揭秘:从入门到秒杀面试官1️⃣ Kafka为何能"吞云吐雾"?性能背后的秘密1.1 顺序写入与零拷贝:性能的双引擎1.2 分区并行:数据的"八车道高速公路"1.3 页缓存与批量处理…...
书籍“之“字形打印矩阵(8)0609
题目 给定一个矩阵matrix,按照"之"字形的方式打印这个矩阵,例如: 1 2 3 4 5 6 7 8 9 10 11 12 ”之“字形打印的结果为:1,…...

react更新页面数据,操作页面,双向数据绑定
// 路由不是组件的直接跳转use client,useEffect,useRouter,需3个结合, use client表示客户端 use client; import { Button,Card, Space,Tag,Table,message,Input } from antd; import { useEffect,useState } from react; impor…...