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

【Android】SQLite使用——增删查改

在这里插入图片描述

三三要成为安卓糕手

一:SQLite介绍

SQLite是Android提供的本地型、轻量级的关系型数据库。

SQLite的特点

  • 轻量级:与其他数据库系统相比,它没有单独的服务器进程,也不需要配置文件。
  • 自包含:所有数据都存储在一个文件中,非常便于管理和传输。
  • 开源:SQLite 是免费的,并且源代码对开发者开放。
  • SQL 支持:支持标准的 SQL 语法,包括 SELECT、INSERT、UPDATE、DELETE 等常用操作。

适合使用 SQLite 的场景有:

  • 存储用户数据,比如用户的配置、账号信息等。
  • 应用的缓存数据,比如离线数据或历史记录。
  • 大量、结构化的数据存储,比如联系人列表或本地消息存储。

使用SQLite

数据库操作,一般包括创建数据库、表格,增删改查几种操作,在 Android 中可以通过 SQLiteOpenHelper 类来管理数据库的创建和更新。

注意:SQLite的建表、增删改查,属于耗时操作,虽然少量的数据操作不会引起主线程卡顿,但还是建议放在后台线程来完成。

二:创建SQLite数据库

1:总代码和分析

public class MySqliteHelper extends SQLiteOpenHelper {//数据库的名字和版本号private static final String DATABASE_NAME = "MyDatabase.db";private static final int DATABASE_VERSION = 1;public MySqliteHelper(@Nullable Context context) {super(context, DATABASE_NAME, null, DATABASE_VERSION);}//第一次创建数据库的时候会调用这个方法,一般会在这里建表@Overridepublic void onCreate(SQLiteDatabase db) {String CREATE_USER_TABLE = "create table user (id integer primary key autoincrement," +"name text not null , age integer not null)";//execute 执行SQL语句db.execSQL(CREATE_USER_TABLE);}//升级数据库,会触发这个方法@Overridepublic void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {//删除旧表db.execSQL("drop table if exists user");//重新onCreate,建立新表onCreate(db);}
}
  • 继承SQLiteOpenHelper,重写onCreate和onUpgreade方法

  • onCreate中创建table表,写好sql语句,exec(execute - 执行)SQL语句;自增主键可以理解成唯一标识符

  • onUpgreade在升级数据库,会触发这个方法

  • DATABASE_NAME指的是数据库文件的名字,版本号1迭代到2,以此类推;用于完成父类构造

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

三:UI界面

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

四:增——插入数据

		/*** 插入数据*/findViewById(R.id.btn_insert).setOnClickListener(view -> {MySqliteHelper mySqliteHelper = new MySqliteHelper(SQLiteActivity.this);//获取写入数据库的对象SQLiteDatabase writableDatabase = mySqliteHelper.getWritableDatabase();//创建contentValues对象,往里面放一条数据ContentValues values = new ContentValues();values.put("name",etUserName.getText().toString().trim());values.put("age",etUserAge.getText().toString().trim());//第二个参数表示,当values为null的时候什么也不插入long newRowId = writableDatabase.insert("user", null, values);Log.i(TAG, "onCreate: 插入数据 newRowId : " + newRowId);});

这里的插入数据是需要写数据,所以创建一个写入数据库的对象(mySqliteHelper.getWritableDatabase();

ContentValues主要作用是封装要插入或更新到数据库(SQLite)中的数据

writableDatabase.insert(“user”, null, values)

  • 第一个参数 "user":目标表的表名。
  • 第二个参数 null:当 values 为空时,指定一个默认填充 NULL 的列名(表示若 values 为空则不插入记录)。
  • 第三个参数 values:一个 ContentValues 对象,存储了要插入的字段名和对应值(键值对形式,如 values.put("name", "张三"))。
  • long newRowId:插入成功时,返回新记录的行 ID(SQLite 自动生成的唯一标识);若插入失败(如违反唯一约束),则返回 -1

效果如下

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

数据被保存到的这里

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这里用的是一款可以打开db数据库文件的软件:Browser for SQLite 自行下载

五:查——查询数据

1:代码

		/*** 查询数据*/findViewById(R.id.btn_select).setOnClickListener(view -> {MySqliteHelper mySqliteHelper = new MySqliteHelper(this);//创建可以读取数据库的对象SQLiteDatabase readableDatabase = mySqliteHelper.getReadableDatabase();//创建查询条件Cursor cursor = readableDatabase.query("user",new String[]{"id", "name", "age"},"age > ? and name like ?",new String[]{"30","%释%"},null,null,"age ASC");//orderBy如果为null,表示默认排序。 ASC=升序  DESC=降序ArrayList<User> users = new ArrayList<>();//光标移动到下一行,有数据就返回true,否则falsewhile(cursor.moveToNext()){//获取id这一列的位置,不存在抛出异常,下面同理int idIndex = cursor.getColumnIndexOrThrow("id");int id = cursor.getInt(idIndex);int nameIndex = cursor.getColumnIndexOrThrow("name");String name = cursor.getString(nameIndex);int ageIndex = cursor.getColumnIndexOrThrow("age");int age = cursor.getInt(ageIndex);//循环一次,就拿到一个User的信息User user = new User(id, name, age);//搞个容器,放很多Userusers.add(user);}//释放资源cursor.close();tvMessage.setText(users.toString());Log.i(TAG, "onCreate: users = " + users.toString());});

(1)Cursor创建查询条件

Cursor可以理解为一个迭代器,用于遍历查询结果。

  • 查询user表的操作

  • 只查询idnameage这三个字段

  • 查询条件是:age > 30 并且 name 中包含 “释” 字

  • 结果按age字段升序排列

    • ASC 的全称是 Ascending,意为 “升序”,表示数据按照从小到大的顺序排列。
    • DESC 的全称是 Descending,意为 “降序”,表示数据按照从大到小的顺序排列。

使用完毕后一定要关闭Cursor,以释放相关资源。

(2)遍历表

moveToNext()相当于判断是否有下一个元素,有就返回true,并移动指针

getColumnIndexOrThrow(“id”),通过id列索引获取,获取当前元素的属性,比如获取第一行的id,返回值就是1

(3)效果

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

六:改 & 删——修改数据

		/*** 更新数据*/findViewById(R.id.btn_update).setOnClickListener(view -> {MySqliteHelper mySqliteHelper = new MySqliteHelper(this);SQLiteDatabase writableDatabase = mySqliteHelper.getWritableDatabase();ContentValues values = new ContentValues();values.put("name",etUserName.getText().toString().trim());values.put("age",etUserAge.getText().toString().trim());//把名字是释的一行数据更新信息,更新内容包含name和ageint count = writableDatabase.update("user", values, "name = ?", new String[]{"释"});});
		/*** 删除数据*/findViewById(R.id.btn_delete).setOnClickListener(view -> {MySqliteHelper mySqliteHelper = new MySqliteHelper(this);SQLiteDatabase writableDatabase = mySqliteHelper.getWritableDatabase();//删除age=18的所有数据int count = writableDatabase.delete("user", "age = ?", new String[]{"18"});});

我们把年龄18的人数据全删掉,把name叫“释”的家伙的信息修改为name = Sansan ,age = 22

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传


文章转载自:

http://ZRo55qxJ.ggtgL.cn
http://3zMMf8vc.ggtgL.cn
http://WLQVa3ju.ggtgL.cn
http://C7mOXHNb.ggtgL.cn
http://TJu3tduA.ggtgL.cn
http://L7luJVwP.ggtgL.cn
http://vaakUd7i.ggtgL.cn
http://dtLFiqB8.ggtgL.cn
http://s6g5kItr.ggtgL.cn
http://tVuXBneE.ggtgL.cn
http://s4MKYJ4U.ggtgL.cn
http://X3LSxgCF.ggtgL.cn
http://I2ydo7nk.ggtgL.cn
http://2qbo0l2M.ggtgL.cn
http://TJWRqH2a.ggtgL.cn
http://gkPPdfGg.ggtgL.cn
http://9SOYmoOv.ggtgL.cn
http://jQaCgKly.ggtgL.cn
http://oNYzQJz1.ggtgL.cn
http://gN77P4Iz.ggtgL.cn
http://yzjgGPHa.ggtgL.cn
http://DwiTYOTu.ggtgL.cn
http://P8nRRPYR.ggtgL.cn
http://tKsjl5Ej.ggtgL.cn
http://EewufZ3y.ggtgL.cn
http://bkHmU4lU.ggtgL.cn
http://3GluUVCT.ggtgL.cn
http://TdGgKBEJ.ggtgL.cn
http://Ha7mAvoF.ggtgL.cn
http://N1ITsnn2.ggtgL.cn
http://www.dtcms.com/a/368866.html

相关文章:

  • DJANGO后端服务启动报错及解决
  • Hive使用Tez引擎出现OOM的解决方法
  • 前端三件套+springboot后端连通尝试
  • AI大模型如何重塑日常?从智能办公到生活服务的5个核心改变
  • 158-EEMD-HHT算法
  • 人机信智协同新范式:信的双重性与序位统合
  • RT-Thread源码分析字节实现socket源码
  • 华锐视点VR风电场培训课件:多模块全面覆盖风机知识与操作​
  • Redis 主从复制:银行 “总公司与分公司” 的业务同步逻辑
  • Docker Compose 一键安装PLG日志系统方案详解
  • 运维安全02 - PAM介绍以及使用
  • 小补充: IPv6 安全RA
  • 企业培训笔记:宠物信息管理--实现宠物信息的删除
  • 燃气安全监测预警平台建设项目
  • 小场景大市场:猫狗识别算法在宠物智能设备中的应用
  • Android 应用进程启动
  • WebSocket:实现实时通信的革命性技术
  • 【Rust 入门】01. 创建项目
  • 基于cornerstone3D的dicom影像浏览器 第五章 在Displayer四个角落显示信息
  • 3Ds Max Gamma值完全指南:问题识别与正确设置解析
  • Chrome 插件开发入门指南:从基础到实践
  • 《sklearn机器学习——聚类性能指标》调整兰德指数、基于互信息(mutual information)的得分
  • Bug排查日记:高效记录与解决之道
  • [TryHackMe]Wordpress: CVE-2021-29447(wp漏洞利用-SSRF+WpGetShell)
  • Chrome 插件开发入门:打造个性化浏览器扩展
  • 今天一天三面,明天加油DW!!!
  • Java基础篇02:基本语法
  • 当前的大部分的AI,可能已经分到了传统那桌了!Causal AI:颠覆传统机器学习的下一代人工智能技术,让AI真正理解“为什么“!
  • Firefox Window 开发流程(二)
  • 树莓派传感器扩展板资料