Android --- SQlite数据存储

使用 SQLite 保存数据  |  Android Developers (google.cn) 

SQLiteOpenHelper 类包含一组用于管理数据库的实用 API。当您使用此类获取对数据库的引用时,系统仅在需要时才执行可能需要长时间运行的数据库创建和更新操作,而不是在应用启动期间执行。您仅需调用 getWritableDatabase() 或 getReadableDatabase() 即可。

注意:由于这些操作可能会长时间运行,因此请务必在后台线程中调用 getWritableDatabase() 或 getReadableDatabase()

这两个方法都可以创建或打开一个现有的数据库(如果数据库已存在则直接打开,否则创建一个新的数据库),并返回一个可对数据库进行读写操作的对象。不同的是,当数据库不可写入的时候(如磁盘空间已满)。
getReadableDatabase()方法返回的对象将以只读的方式去打开数据库
getWritableDatabase()方法则将出现异常

创建一个数据库管理类继承 SQLiteOpenHelper,并重写其中的方法

  • onCreate() 创建数据库
  • onUpgrade() 数据库升级
  • onDowngrade() 和 onOpen() 并不是必须

准备数据库框架

准备表名、列名

 // ----表名public static final String STUTDY_SQLITE_TABLE = "STUTDY_SQLITE_TABLE";// ----列名public static final String COLUNM_ID = "ID";public static final String COLUNM_NAME = "COLUNM_NAME";public static final String COLUNM_PHONE = "COLUNM_PHONE";public static final String COLUNM_PASSWORD = "COLUNM_PASSWORD";

创建数据库 onCreate()

 // 第一次尝试访问数据库对象时会调用该方法创建新表public void onCreate(SQLiteDatabase sqLiteDatabase) {// 创建新表的语句String createNewTableSqlStr = "CREATE TABLE " + STUTDY_SQLITE_TABLE + " (ID INTEGER     PRIMARY KEY AUTOINCREMENT," + COLUNM_NAME + " TEXT," + COLUNM_PHONE + " TEXT," + COLUNM_PASSWORD + " TEXT)";sqLiteDatabase.execSQL(createNewTableSqlStr);}

修改数据库 onUpgrade()

// 当数据库的版本号发生变化时会调用该方法public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {}

CRUD 操作

C-添加 

public long insert(String table, String nullColumnHack, ContentValues values)

参数1:表名

参数2:将指示框架在 ContentValues 为空(即您没有 put 任何值)时应执行哪些操作

参数3:内容

通过将 ContentValues 对象传递给 insert() 方法,将数据插入到数据库中, 方法会返回新创建行的 ID;如果在插入数据时出错,会返回 -1。如果数据与数据库中已有的数据之间存在冲突,就会出现这种情况。

public boolean addOne(UserBean userBean) {//获取要编写的唯一一个数据库/* getWritableDatabase SQLiteOpenHelper中的方法*/SQLiteDatabase sqLiteDatabase = this.getWritableDatabase();// 有点像flutter里的键值对ContentValues cv = new ContentValues();cv.put(COLUNM_NAME, userBean.getName());cv.put(COLUNM_PHONE, userBean.getPhone());cv.put(COLUNM_PASSWORD, userBean.getPassWord());long insert = sqLiteDatabase.insert(STUTDY_SQLITE_TABLE, null, cv);return insert != -1;}

R-查询

使用 query() 方法,向其传递选择条件和所需的列。

该方法合并了 insert() 和 update() 元素,查询结果会包含在 Cursor 对象中返回。

Cursor对象是查询的结果集

public Cursor query(String table, String[] columns, String selection,
        String[] selectionArgs, String groupBy, String having,
        String orderBy, String limit)

  • table:表名
  • columns:指定要查询的列,如果为空则返回所有列
  • selection:指定查询条件,使用占位符 ?
  • selectionArgs:查询条件具体的值
  • groupBy:指定分组方式
  • having:指定having方式
  • orderBy:指定排序方式
  • limit:限制查询返回的行数

使用rawQuery()方法

public Cursor rawQuery(String sql, String[] selectionArgs)

  • sql:查询语句
  • selectionArgs:查询条件
// 从数据库中查询String querySqlStr = "SELECT * FROM " + STUTDY_SQLITE_TABLE;SQLiteDatabase sqLiteDatabase = this.getReadableDatabase(); //可读Cursor cursor = sqLiteDatabase.rawQuery(querySqlStr, null);

U-修改

使用 update() 方法.

更新表可将 insert() 的 ContentValues 语法与 delete() 的 WHERE 语法相结合。

update() 方法的返回值是数据库中受影响的行数.

public int update(String table, ContentValues values, String whereClause, String[] whereArgs)

  • table:表名
  • values:更新的值
  • whereClause:可选的更新条件
  • whereArgs:更新条件的值
public boolean updataInfo(UserBean userBean) {SQLiteDatabase sqLiteDatabase = this.getWritableDatabase();ContentValues cv = new ContentValues();cv.put(COLUNM_NAME, userBean.getName());cv.put(COLUNM_PHONE, userBean.getPhone());cv.put(COLUNM_PASSWORD, userBean.getPassWord());int result = sqLiteDatabase.update(STUTDY_SQLITE_TABLE, cv, "ID = ?", new String[]{String.valueOf(userBean.getId())});return result > 0;}

D-删除

需从表中删除行,您需要提供选择条件,以标识 delete() 方法的目标行。该机制与 query() 方法的目标选择参数的工作方式相同

delete() 方法的返回值表示从数据库中删除的行数。

public int delete(String table, String whereClause, String[] whereArgs) 

  • table:表名
  • whereClause:可选的更新条件
  • whereArgs:更新条件的值
 public boolean deleteOne(UserBean userBean) {SQLiteDatabase sqLiteDatabase = this.getWritableDatabase();System.out.println("要删除的id:" + userBean.getId());/* 删除语句返回的是受影响的行数* 行数>0返回true 否则返回false */int result = sqLiteDatabase.delete(STUTDY_SQLITE_TABLE, COLUNM_ID + " = ?", new String[]{String.valueOf(userBean.getId())});return result > 0;}

保留数据库连接

由于在数据库关闭时,调用 getWritableDatabase() 和 getReadableDatabase() 的成本比较高,因此只要有可能需要访问数据库,就应保持数据库连接处于打开状态。通常情况下,最好在发出调用的 Activity 的 onDestroy() 中关闭数据库。

@Override
protected void onDestroy() {dbHelper.close();super.onDestroy();
}

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

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

相关文章

4-用户权限控制(后端)

在计算机系统中,用户权限控制是一种机制,用于限制用户对系统资源的访问和操作。它可以确保只有经过授权的用户可以执行特定的操作,并限制未经授权的用户的访问权限。 用户权限控制通常涉及以下几个方面: 用户认证:用户…

JAVA实现easyExcel批量导入

注解类型描述ExcelProperty导入指定当前字段对应excel中的那一列。可以根据名字或者Index去匹配。当然也可以不写,默认第一个字段就是index0,以此类推。千万注意,要么全部不写,要么全部用index,要么全部用名字去匹配。…

嵌入式前后台(Bare-Metal RTOS-Like)架构详解

前后台(Bare-Metal RTOS-Like)架构 在嵌入式系统开发中,针对资源有限的STM32微控制器,前后台(Bare-Metal RTOS-Like)架构是一种轻量级的实时性设计方法,它模拟了实时操作系统(RTOS&…

个人电脑本地部署LLM

普通电脑配置即可本地运行大模型,本地部署LLM最简单的方法 OLLAMA Ollama是一个开源框架,专门设计用于在本地运行大型语言模型(LLM)。它的主要功能是在Docker容器中部署和管理LLM,使得在本地运行大模型的过程变得非常…

python之List列表

1. 高级数据类型 Python中的数据类型可以分为:数字型(基本数据类型)和非数字型(高级数据类型) 数字型包含:整型int、浮点型float、布尔型bool、复数型complex 非数字型包含:字符串str、列表l…

CPPTest实例分析(C++ Test)

1 概述 CppTest是一个可移植、功能强大但简单的单元测试框架,用于处理C中的自动化测试。重点在于可用性和可扩展性。支持多种输出格式,并且可以轻松添加新的输出格式。 CppTest下载地址:下载地址1  下载地址2 下面结合实例分析下CppTest如…

MAC系统升级问题记录

一、 场景 新购置一台MAC mini盒子作为开发使用,系统版本为macOS Sonoma 14.2, 由于是新机器,从新开始安装开发工具,从AppStore中获取XCode 15.3 版本,编译现有工程项目,报如下错误: SDK does not contai…

Vue3+ts(day03:ref和reactive)

学习源码可以看我的个人前端学习笔记 (github.com):qdxzw/frontlearningNotes 觉得有帮助的同学,可以点心心支持一下哈(笔记是根据b站上学习的尚硅谷的前端视频【张天禹老师】,记录一下学习笔记,用于自己复盘,有需要学…

传感器在机械自动化中的应用有哪些?

传感器在机械自动化领域扮演了非常关键的角色,它们是实现高效和精准控制的基础。传感器可以检测和测量机械系统中的各种物理量,如位置、速度、温度、压力等,并将这些物理量转换成电信号,以便控制系统能够进行分析和响应。以下是一…

vue使用外部的模板

在 Vue 2 中,如果你希望使用外部的 HTML 文件内容作为模板,有几种方法可以实现,但每种方法都有其局限性或需要注意的事项。下面是一些可能的方法: 1. 使用 AJAX 加载外部 HTML 你可以使用 AJAX 来异步加载外部的 HTML 文件&…

ARCGIS PRO3 三维模型OSGB转SLPK场景数据集

1.前言 因项目工作,需要将三维模型发布到arcgisserver上,但arcgisserver只支持slpk格式的模型,于是我开启了漫长的三维模型格式转换之旅,在这里记录下本人踩过的坑。 2.三维模型数据情况 2.1 模型大小:在20GB以上&a…

tcp inflight 守恒算法的自动收敛

inflight 守恒算法看起来只描述理想情况,现实很难满足,是这样吗? 从 reno 到 bbr,无论哪个算法都在描述理想情况,以 reno 和 bbr 两个极端为例,它们分别描述两种理想管道,reno 将 buffer 从恰好…

goroutinue和channel

goroutinue和channel 需求传统方式实现goroutinue进程和线程说明并发和并行go协程和go主线程MPG设置Go运行的cpu数 channel(管道)-看个需求使用互斥锁、写锁channel 实现 使用select可以解决从管道取数据的阻塞问题(无需手动关闭channel了)goroutinue中使…

Vue 3的性能优化策略

Vue 3有一些性能优化策略可以帮助提升应用的性能: 静态提升(Static Template Hoisting):Vue 3使用了模板编译提升技术,将模板编译为更高效的渲染函数。这个过程中,静态模板部分会被提升到编译阶段&#xff…

Rust 字符串基本使用教程及代码演示

文章目录 一、基本使用教程1、字符串类型String&str 2、创建字符串创建String创建&str 3、字符串操作索引切片格式化字符串比较 4、字符串和集合5、字符串的错误处理6、参考链接 二、代码演示1、代码演示2、执行结果 一、基本使用教程 在Rust中,字符串是编…

61、回溯-分割回文串

思路: 还是全排列的思路,列出每一种组合,然后验证是否是回文,如果是子串放入path中,在验证其他元素是否也是回文。代码如下: class Solution {// 主方法,用于接收一个字符串s并返回所有可能的…

油烟净化器控制食堂油烟排放:高效净化设备的必要性与实施策略

我最近分析了餐饮市场的油烟净化器等产品报告,解决了餐饮业厨房油腻的难题,更加方便了在餐饮业和商业场所有需求的小伙伴们。 在食堂环境中,油烟排放是一个普遍存在且备受关注的问题。选择高效的油烟净化设备对于保障空气质量、改善生活环境…

智能变频三模正弦波控制器

智能变频三模正弦波控制器 前言一、图片介绍总结 前言 不敢动,完全不敢动。多做笔记,完全了解之后再说吧 一、图片介绍 轮毂电机 主角登场 淘宝关于这款控制器的介绍 当然不同的型号功能不同 学习线插上就会转,可以使用继电器控制通断。 电门…

mac资源库的东西可以删除吗?提升Mac运行速度秘籍 Mac实用软件

很多小伙伴在使用mac电脑处理工作的时候,就会很疑惑,电脑的运行速度怎么越来越慢,就想着通过删除mac资源库的东西,那么mac资源库的东西可以删除吗?删除了会不会造成电脑故障呢? 首先,mac资源库…

day03--react中setState的使用

一、setState state状态必须通过setState进行更新&#xff0c;且更新是一种合并&#xff0c;不是替换。 下面通过一个切换状态的例子说明 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewp…