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

【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://www.xdnf.cn/news/20365.html

相关文章:

  • 有哪些AI产品可以真正提高办公和学习效率?
  • 【LeetCode】2749. 得到整数零需要执行的最少操作数
  • 关于无法导入父路径的问题
  • MySQL源码部署(rhel7)
  • SQL面试题及详细答案150道(61-80) --- 多表连接查询篇
  • java面试中经常会问到的集合问题有哪些(基础版)
  • GigaDevice(兆易创新)GD25Q64CSJGR 64Mbit FLASH
  • c#动态树形表达式详解
  • uni-app 和 uni-app x 的区别
  • 【Cell Systems】SpotGF空间转录组去噪算法文献分享
  • 图像去雾:从暗通道先验到可学习融合——一份可跑的 PyTorch 教程
  • <video> 标签基础用法
  • MySQL-安装MySQL
  • UE4 Mac构建编译报错 no template named “is_void_v” in namespace “std”
  • 无需bootloader,BootROM -> Linux Kernel 启动模式
  • Java全栈开发工程师面试实录:从基础到实战的深度探讨
  • PyTorch图像数据转换为张量(Tensor)并进行归一化的标准操作
  • 管理中心理学问:动机与管理的关联
  • 什么是CRM?定义、作用、功能、选型|CRM百科
  • 使用若依加Trae快速搭建一对儿多对多CRUD
  • 移植Qt4.8.7到ARM40-A5
  • PiscCode基于 Mediapipe 实现轨迹跟踪
  • TOGAF之架构标准规范-迁移计划
  • nginx 反向代理使用变量的坑
  • 亚马逊商品转化率怎么提高?从传统运营到智能广告的系统化突破
  • Nginx 配置片段主要用于实现​​正向代理​​,可以用来转发 HTTP 和 HTTPS 请求
  • LangChain关于提示词的几种写法
  • 深度学习:Dropout 技术
  • c++ 第三方库与个人封装库
  • 【完整源码+数据集+部署教程】西兰花实例分割系统源码和数据集:改进yolo11-AggregatedAtt