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.mfbz.cn/a/575609.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

13 JavaScript学习:运算符

JavaScript 运算符 JavaScript 中有多种类型的运算符,包括以下几类: 算术运算符:用于执行基本的数学运算,如加法()、减法(-)、乘法(*)、除法(/&a…

力扣刷题学习(跟随视频学着刷)

使用入门 视频链接 【手把手带你刷Leetcode力扣|各个击破数据结构和算法|大厂面试必备技能【已完结】-哔哩哔哩】 https://b23.tv/vIcRT61 时空复杂度 时间: 空间:主要有O(1)和O(n)两种,只用计算开辟的内存&#xff…

java垃圾回收机制

java垃圾回收机制 我们知道,Java会自动管理和释放内存,它不像C/C那样要求我们手动管理内存,JVM提供了一套全自动的内存管理机制,当一个Java对象不再用到时,JVM会自动将其进行回收并释放内存,那么对象所占内…

平抑风电波动的电-氢混合储能容量优化配置

这篇论文中的EMD分解法在非线性扰动信号分解上优于小波分解法,EMD分解出来的imf各频次信号,继而利用C2F实现信号重构,根据最大波动量限值剔除出需要储能平抑的波动量,继而用超级电容实现平抑(论文中用的碱水电解槽+燃料电池我认为有很多个点可以佐证不合适,但是电制氢是热…

与绿色同行,与环保相约—ATFX世界地球日开展环境保护公益行

2024年4月22日是第55个世界地球日。今年世界地球日的主题为“全球战塑”(Planet vs. Plastics),旨在号召公众、企业、政府和非政府组织团结起来,呼吁终结塑料危害,以确保人类和地球健康。作为公益事业的坚定倡导者与行…

PHP项目搭建与启动

1、拉取项目 2、安装phpstudy 下载地址: Windows版phpstudy下载 - 小皮面板(phpstudy) (xp.cn) 软件安装: Apache2.4.39、Nginx1.15.11、MySQL8.0.12、 composer2.5.8 添加伪静态 将下面代码写入到伪静态配置文本域框内: location ~* (ru…

ElasticSearch复合查寻

FunctionScore主要是在原始查询的基础上去修改一下算分的。 而BooleanQuery布尔查询,它不会去修改算分,而是把多个查询语句组合在一起形成新查询。这些被组合的查询语句,我们都称之为叫子查询了,这些子查询,它的组合方…

C语言----链表

大家好,今天我们来看看C语言中的一个重要知识,链表。当然大家可以先从名字中看出来。就是一些表格用链子连接。那么大家是否想到了我们以前学的数组,因为数组也是相连的呀。是吧。但是链表与数组还是有区别的,那么链表是什么有什么…

算法----BF算法KMP算法

请想象一个情景: 当你脑海中突然浮现出一个词,你该怎么去找到这个词的有关内容? 打开我们浏览器的搜索框,输入你想的这个词,然后点击Enter。浏览器就会自动搜索与该词匹配的内容。 这个过程实际上可以简化成以下形式…

【数据结构(邓俊辉)学习笔记】向量02——动态空间管理

文章目录 1. 概述2. 静态空间管理缺点3. 动态空间管理3.1 扩容3.1.1 如何实现扩容3.1.2 扩容算法3.1.3 容量递增策略 VS 容量倍增策略3.1.3.1 容量倍增策略分摊分析3.1.3.2 容量递增策略分摊分析3.1.3.3 结果对比 3.2缩容3.2.1 动态缩容算法实现3.2.2 动态缩容算法时间复杂度 4…

2024最新Nessus 免费安装 附详细安装教程

免责声明 请勿利用文章内的相关技术从事非法测试。由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,作者不为此承担任何责任,请遵守网络安全法律。本次仅用于测试,请完成测试后24小时之…

C++程序在Windows平台上各种定位内存泄漏的方法

一、前言 在Linux平台上有valgrind可以非常方便的帮助我们定位内存泄漏,因为Linux在开发领域的使用场景大多是跑服务器,再加上它的开源属性,相对而言,处理问题容易形成“统一”的标准。而在Windows平台,服务器和客户端…

用docker方式安装openGauss数据库的事项记录

文章目录 (一)背景(二)安装(2.1)安装docker(2.2)安装openGauss (三)运行(3.1)运行openGauss镜像(3.2)连接open…

区块链技术与应用学习笔记(5-7节)——北大肖臻课程

​ 目录 ​BTC实现 基于交易的账本模式: UTXO集合: 交易费用: BTC网络 1.应用层: 2.网络层: 3传播层: 什么是鲁棒? BTC挖矿: 出块奖励: 挖矿难度调整&#…

Centos安装/更新Docker

首先要配置好Centos 配置好静态IP 替换yum源为阿里云 Docker是什么? Docker 是一种开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后部署到任何流行的 Linux 机器上。是一种虚拟化的技术,可以把…

基于socket编程实现TCP和UDP的通信流程

socket编程的常用函数,可以参考以下这篇博客 socket编程-----常用socket编程函数https://blog.csdn.net/ZZZCY2003/article/details/138071210 关于TCP的三次挥手、四次挥手过程和UDP的报文分析可以参考以下两篇博客 计算机网络--运输层https://blog.csdn.net/ZZ…

深度学习-N维数组和访问元素

目录 N维数组访问元素 N维数组 N维数组是机器学习和神经网络的主要数据结构 访问元素 最后一个子区域中的::是跳的意思,这个区域说明的是从第一个元素(即第一行第一列那个)对行开始跳3下循环下去直到行结束、对列开始跳2下循环下去直到列…

如何解决IntelliJ IDEA 2024打开项目时频繁闪退问题

🐯 如何解决IntelliJ IDEA 2024打开项目时频繁闪退问题 🐾 文章目录 🐯 如何解决IntelliJ IDEA 2024打开项目时频繁闪退问题 🐾摘要引言正文📘 识别问题📙 内存配置调整步骤1: 定位vmoptions文件步骤2: 修改…

C++初阶之入门

零、什么是C C是基于C语言而产生的,它既可以进行C语言的过程化程序设计,又可以进行以抽象数据类型为特点的基于对象的程序设计,还可以进行面向对象的程序设计。 C缺点之一,是相对许多语言复杂,而且难学难精。许多人说学…

为什么g++编译后的cpp文件名字为a,out

文章目录 为什么g编译后的cpp文件名字为a,out能修改默认名变成cpp文件名吗关于作者 为什么g编译后的cpp文件名字为a,out 在使用g编译C源代码时,默认情况下生成的可执行文件名为 a.out。这是由于在Unix和类Unix系统上,编译器的默认行为是将生成的可执行文…