【android开发-17】android中SQLite数据库CRUD详细介绍

1,SQLite数据库读写的操作步骤

在Android中,对SQLite数据库的操作主要包括以下步骤:

1,创建数据库:首先,您需要创建一个SQLite数据库。这可以通过在Android项目中创建一个新的类来实现,该类继承自SQLiteOpenHelper。在这个类中,您可以定义数据库名、版本号以及创建表的SQL语句。在创建数据库时,如果该数据库文件不存在,系统会调用onCreate方法来创建数据库文件,并返回一个Database对象。如果数据库文件已经存在,系统会直接打开这个数据库并返回一个Database对象。

2,创建表:在创建了数据库之后,您需要使用CREATE TABLE语句来创建表。在Android中,您可以在DatabaseHelper类中定义CREATE TABLE语句,并在onCreate方法中执行此语句来创建表。

3,插入数据:要向SQLite数据库中插入数据,您需要使用INSERT语句。INSERT语句可以在DatabaseHelper类中的方法中定义,并在需要插入数据时调用。在INSERT语句中,您需要指定要插入的表名、要插入的数据以及任何必要的条件。

4,读取数据:要读取SQLite数据库中的数据,您需要使用SELECT语句。SELECT语句可以在DatabaseHelper类中的方法中定义,并在需要读取数据时调用。在SELECT语句中,您需要指定要查询的表名、要返回的字段以及任何必要的条件。在查询数据之后,您需要关闭Cursor对象以释放资源。

5,更新数据:要更新SQLite数据库中的数据,您需要使用UPDATE语句。UPDATE语句可以在DatabaseHelper类中的方法中定义,并在需要更新数据时调用。在UPDATE语句中,您需要指定要更新的表名、要更新的数据以及任何必要的条件。

6,删除数据:要从SQLite数据库中删除数据,您需要使用DELETE语句。DELETE语句可以在DatabaseHelper类中的方法中定义,并在需要删除数据时调用。在DELETE语句中,您需要指定要删除的表名以及任何必要的条件。

7,关闭数据库:在完成所有数据库操作后,一定要记得关闭数据库连接。这可以通过调用Database对象的close方法来完成。
以上就是在Android中对SQLite数据库进行操作的基本步骤。

2,创建数据库
以下是在Android中创建数据库的参考代码:

import android.content.Context;  
import android.database.sqlite.SQLiteDatabase;  
import android.database.sqlite.SQLiteOpenHelper;  public class DatabaseHelper extends SQLiteOpenHelper {  // 数据库名  private static final String DATABASE_NAME = "database.db";  // 数据库版本号  private static final int DATABASE_VERSION = 1;  // 定义数据库表名  public static final String TABLE_NAME = "table";  // 创建表的SQL语句  private String CREATE_TABLE = "CREATE TABLE " + TABLE_NAME + " (" +  "_id INTEGER PRIMARY KEY," +  "name TEXT," +  "age INTEGER" +  ");";  public DatabaseHelper(Context context) {  super(context, DATABASE_NAME, null, DATABASE_VERSION);  }  @Override  public void onCreate(SQLiteDatabase db) {  db.execSQL(CREATE_TABLE);  }  @Override  public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {  // 这里可以更新数据库表结构  }  
}

以上代码创建了一个名为"database.db"的SQLite数据库,并在其中创建了一个名为"table"的表。该表包含三个字段:“_id”(主键)、“name”(文本类型)和"age"(整数类型)。在onCreate方法中,调用execSQL方法执行CREATE TABLE语句来创建表。当需要更新数据库时,可以在onUpgrade方法中进行相应的操作。

注意:数据库文件存储在/data/data/package name/databases/目录下。

3,升级数据库

以下是在Android中升级数据库的参考代码:

import android.content.Context;  
import android.database.sqlite.SQLiteDatabase;  
import android.database.sqlite.SQLiteOpenHelper;  public class DatabaseHelper extends SQLiteOpenHelper {  // 数据库名  private static final String DATABASE_NAME = "database.db";  // 数据库版本号  private static final int DATABASE_VERSION = 2;  // 定义数据库表名  public static final String TABLE_NAME = "table";  // 创建表的SQL语句  private String CREATE_TABLE = "CREATE TABLE " + TABLE_NAME + " (" +  "_id INTEGER PRIMARY KEY," +  "name TEXT," +  "age INTEGER" +  ");";  public DatabaseHelper(Context context) {  super(context, DATABASE_NAME, null, DATABASE_VERSION);  }  @Override  public void onCreate(SQLiteDatabase db) {  db.execSQL(CREATE_TABLE);  }  @Override  public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {  // 删除旧的表  db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME);  // 创建新的表  onCreate(db);  }  
}

以上代码将删除旧的数据库表,并创建一个新的表来升级数据库。在onUpgrade方法中,调用execSQL方法执行DROP TABLE语句来删除旧的表,然后调用onCreate方法重新创建新的表。这样就可以实现数据库的升级。
SQLiteOpenHelper 构造函数的第四个参数表示当前数据库的版本号。只要传入比之前大的版本号,就可以让onUpgrade方法得到执行。

注意:如果如果数据库文件,例如database.db,已经存在,onCreate方法就不会再次执行,因此新添加的表就不会创建。

4,添加数据
在Android中,我们通常使用SQLite数据库来存储应用数据。以下是一个简单的示例,展示如何在Android中向SQLite数据库添加数据:

首先,我们需要创建一个数据库助手类,这个类继承了SQLiteOpenHelper。在这个类中,我们可以定义数据库的名称、版本号以及创建表的SQL语句。

import android.content.Context;  
import android.database.sqlite.SQLiteDatabase;  
import android.database.sqlite.SQLiteOpenHelper;  public class DBHelper extends SQLiteOpenHelper {  // 数据库名  private static final String DATABASE_NAME = "database.db";  // 数据库版本号  private static final int DATABASE_VERSION = 1;  // 定义数据库表名  public static final String TABLE_NAME = "table";  // 创建表的SQL语句  private String CREATE_TABLE = "CREATE TABLE " + TABLE_NAME + " (" +  "_id INTEGER PRIMARY KEY," +  "name TEXT," +  "age INTEGER" +  ");";  public DBHelper(Context context) {  super(context, DATABASE_NAME, null, DATABASE_VERSION);  }  @Override  public void onCreate(SQLiteDatabase db) {  db.execSQL(CREATE_TABLE);  }  @Override  public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {  // 这里可以更新数据库表结构  }  
}

然后,我们可以创建一个新的方法来插入数据到数据库中:

public void insertData(String name, int age) {  SQLiteDatabase db = this.getWritableDatabase();  ContentValues values = new ContentValues();  values.put("_id", 1);  values.put("name", name);  values.put("age", age);  db.insert(TABLE_NAME, null, values);  db.close();  
}

在上述代码中,我们首先获取一个可写入的数据库实例,然后创建一个ContentValues对象来存储我们要插入的数据。我们使用ContentValues的put方法来添加数据,最后使用SQLiteDatabase的insert方法来插入数据。注意,每次插入数据后,我们都需要关闭数据库连接。

5,更新数据
在Android中,我们通常使用SQLite数据库来存储应用数据。如果需要更新数据库中的数据,我们可以使用SQLiteDatabase的update方法。以下是一个简单的示例,展示如何在Android中更新SQLite数据库中的数据:
我们可以创建一个新的方法来更新数据:

public void updateData(String name, int age, int id) {  SQLiteDatabase db = this.getWritableDatabase();  ContentValues values = new ContentValues();  values.put("name", name);  values.put("age", age);  db.update(TABLE_NAME, values, "_id = " + id, null);  db.close();  
}

在上述代码中,我们首先获取一个可写入的数据库实例,然后创建一个ContentValues对象来存储我们要更新的数据。我们使用ContentValues的put方法来添加数据,最后使用SQLiteDatabase的update方法来更新数据。注意,每次更新数据后,我们都需要关闭数据库连接。

注意:db.update的第三和第四参数来指定更新哪几行。

6,删除数据
在Android中,我们使用SQLite数据库来存储数据。如果你想从数据库中删除数据,你可以使用SQLiteDatabase的delete方法。以下是一个简单的示例,展示如何在Android中删除SQLite数据库中的数据:
我们可以创建一个新的方法来删除数据:

public void deleteData(int id) {  SQLiteDatabase db = this.getWritableDatabase();  db.delete(TABLE_NAME, "_id = " + id, null);  db.close();  
}

在上述代码中,我们首先获取一个可写入的数据库实例,然后使用SQLiteDatabase的delete方法来删除数据。注意,每次删除数据后,我们都需要关闭数据库连接。

7,查询数据

我们可以创建一个方法来执行查询:

public Cursor queryData(String sql) {  SQLiteDatabase db = this.getReadableDatabase();  Cursor cursor = db.rawQuery(sql, null);  return cursor;  
}

你可以使用上面的方法来执行你的SQL查询。这个方法会返回一个Cursor对象,你可以使用这个对象来获取查询结果。例如:

Cursor cursor = dbHelper.queryData("SELECT * FROM " + TABLE_NAME);  
while (cursor.moveToNext()) {  String name = cursor.getString(cursor.getColumnIndex("name"));  int age = cursor.getInt(cursor.getColumnIndex("age"));  // 处理数据...  
}  
cursor.close();

请注意,上述代码是基础用法示例,并未处理各种可能的异常。在生产环境中,你应该做好异常处理,并确保在查询结束后关闭Cursor和SQLiteDatabase。

SQLiteDatabase中还提供了一个query的方法对数据进行查询。参数如下:
在这里插入图片描述

8,完整的参考代码用例
在Android中,我们可以使用SQLite数据库进行CRUD(创建、读取、更新、删除)操作。以下是一个简单的例子,展示了如何在Android应用中实现这些操作:

首先,我们需要创建一个SQLite数据库和一张表。这个可以通过创建一个名为DatabaseHelper的类来完成,如下所示:

import android.content.Context;  
import android.database.sqlite.SQLiteDatabase;  
import android.database.sqlite.SQLiteOpenHelper;  public class DatabaseHelper extends SQLiteOpenHelper {  // 数据库名  private static final String DATABASE_NAME = "database.db";  // 数据库版本号  private static final int DATABASE_VERSION = 1;  // 定义数据库表名  public static final String TABLE_NAME = "table";  // 创建表的SQL语句  private String CREATE_TABLE = "CREATE TABLE " + TABLE_NAME + " (" +  "_id INTEGER PRIMARY KEY," +  "name TEXT," +  "age INTEGER" +  ");";  public DatabaseHelper(Context context) {  super(context, DATABASE_NAME, null, DATABASE_VERSION);  }  @Override  public void onCreate(SQLiteDatabase db) {  db.execSQL(CREATE_TABLE);  }  @Override  public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {  // 这里可以更新数据库表结构  }  
}

接下来,我们可以在主应用类中实现对数据库的CRUD操作:

import android.content.ContentValues;  
import android.database.Cursor;  
import android.database.sqlite.SQLiteDatabase;  
import android.util.Log;  public class MainActivity extends AppCompatActivity {  private DatabaseHelper dbHelper;  private SQLiteDatabase db;  @Override  protected void onCreate(Bundle savedInstanceState) {  super.onCreate(savedInstanceState);  setContentView(R.layout.activity_main);  // 初始化DatabaseHelper对象,并打开数据库连接  dbHelper = new DatabaseHelper(this);  db = dbHelper.getWritableDatabase();  }  // 创建记录  public void create() {  ContentValues values = new ContentValues();  values.put("_id", 1);  values.put("name", "张三"); // 年龄是整数,所以用了INTEGER类型。如果是小数,可以用REAL类型。//如果是文本,可以用TEXT类型。如果是BLOB,可以用BLOB类型。等等。//详情请查阅SQLite官方文档。   values.put("age", 28);  // 第一个参数是表名,第二个参数是保留字,第三个参数是//ContentValues对象,即需要插入的数据。  db.insert(DatabaseHelper.TABLE_NAME, null, values);  }  // 读取记录(查询所有记录)  // 第一个参数是表名,第二个参数是字段数组(null表示所有字段),//后面的参数都是保留字,最后一个是排序方式,比如"ASC"或"DESC"。//这里没有指定排序方式,所以默认是按照_id的升序排列。//如果需要按照其他字段排序,需要指定该字段和排序方式。//例如:db.query(TABLE_NAME, null, "name ASC", null, null, null, null); //表示按照name字段的升序排列。详情请查阅SQLite官方文档。//另外,这里没有指定where子句,所以会查询所有记录。//如果需要查询满足特定条件的记录,需要在query方法的第二个参数中指定条件,//例如:"name = ?",并且在方法的第四个参数中指定条件对应的值,//例如:"张三"。这样就会查询name字段等于"张三"的所有记录。如果查询条件包含多个字段,需要把多个条件用AND或OR连接起来。//例如:"name = ? AND age > ?",并且在方法的第四个参数中指定值:"张三","25"。//这样就会查询name字段等于"张三"并且age字段大于25的所有记录。等等。//详情请查阅SQLite官方文档。最后需要注意的是,在查询数据之后,//需要关闭Cursor对象以释放资源。详情请查阅Android官方文档。例如:cursor.close(); //或者 cursor.closeQuietly(); 注意这两个方法都是从Cursor类中继承//过来的,而不是从SQLiteQuery类中继承过来的。因此可以确保资源被正确释//放。此外,为了避免在某些情况下发生内存泄漏问题,建议在不再需要public void read() {  Cursor cursor = db.query(DatabaseHelper.TABLE_NAME, null, null, null, null, null, null);  

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

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

相关文章

专业课145+总分440+东南大学920考研专业基础综合信号与系统数字电路经验分享

个人情况简介 今年考研440,专业课145,数一140,期间一年努力辛苦付出,就不多表了,考研之路虽然艰难,付出很多,当收获的时候,都是值得,考研还是非常公平,希望大…

Qt开发 之 记一次安装 Qt5.12.12 安卓环境的失败案例

文章目录 1、安装Qt2、安卓开发的组合套件2.1、CSDN地址2.2、官网地址2.3、发现老方法不适用了 3、尝试用新方法解决3.1、先安装JDK,搞定JDK环境变量3.1.1、安装jdk3.1.2、确定jdk安装路径3.1.3、打开系统环境变量配置3.1.4、配置系统环境变量3.1.5、验证JDK环境变量…

ERPNext SQL 注入漏洞复现

0x01 产品简介 ERPNext 是一套开源的企业资源计划系统。 0x02 漏洞概述 ERPNext 系统frappe.model.db_query.get_list 文件 filters 参数存在 SQL 注入漏洞,攻击者除了可以利用 SQL 注入漏洞获取数据库中的信息(例如,管理员后台密码、站点的用户个人信息)之外,甚至在高权…

100:ReconFusion: 3D Reconstruction with Diffusion Priors

简介 官网 少样本重建必然导致nerf失败,论文提出使用diffusion模型来解决这一问题。从上图不难看出,论文一步步提升视角数量,逐步与Zip-NeRF对比。 实现流程 Diffusion Model for Novel View Synthesis 给定一组输入图像 x o b s { x i…

EMNLP 2023 获奖论文公布,大模型、NLP等领域火爆

EMNLP是计算语言学和自然语言处理领域顶级国际会议之一,属于CCF B类,是由 ACL 下属的SIGDAT小组主办的NLP领域顶级国际会议,一年举办一次。相较于ACL,EMNLP更偏向于NLP在各个领域解决方案的学术探讨。 今年的EMNLP 2023 已于2023…

Excel COUNT类函数使用

目录 一. COUNT二. COUNTA三. COUNTBLANK四. COUNTIF五. COUNTIFS 一. COUNT ⏹用于计算指定范围内包含数字的单元格数量。 基本语法 COUNT(value1, [value2], ...)✅统计A2到A7所有数字单元格的数量 ✅统计A2到A7,B2到B7的所有数字单元格的数量 二. COUNTA ⏹计…

Unity中Shader黑白阀值后处理效果

文章目录 前言一、我们先来PS看一下黑白阀值的效果二、使用step(a,b)函数实现效果三、实现脚本控制黑白阀值1、在Shader属性面板定义控制阀值变量2、把step的a改为_Value3、在后处理脚本设置公共成员变量,并且设置范围为(0,1)4、在Graphics.B…

angular状态管理方案(ngrx)

完全基于redux的ngrx方案,我们看看在angular中如何实现。通过一个简单的计数器例子梳理下整个流程 一 安装 :npm i ngrx/store 这里特别要注意一点:安装 ngrx/store的时候会出现和angular版本不一致的问题 所以检查一下angular/core的版本…

HTML的img常见应用属性

目录 一、src、alt、width、height 的运用二、title的运用三、align的运用四、border的运用 一、src、alt、width、height 的运用 src指定图像的URL,即图像的路径alt指定图像的替代文本,当图像无法显示时,会显示替代文本。width指定图像的宽…

php操作数据库,用wampserver工具

php操作数据库,用wampserver工具 打开wampserver数据库可视化,创建表格,插入数据 DROP TABLE IF EXISTS user; CREATE TABLE IF NOT EXISTS user (user_Id int NOT NULL AUTO_INCREMENT COMMENT 用户编号,user_Name varchar(20) CHARACTER S…

使用MFC实现数据输出真的好方便(C++)

void CMFCApplication1Dlg::OnEnKillfocusEdit1() { //失去焦点就在上部的框显示 CString cont; GetDlgItemTextW(IDC_STATIC2, cont); cont L"你好啊\n"; SetDlgItemTextW(IDC_STATIC2,cont); // TODO: 在此添加控件通知处理程序代码 }

(三潮来袭)探寻2023年科技变革潮流与2024年前瞻展望

2023年对于IT行业来说是一个动荡而又充满变革的一年。随着世界逐渐走出前几年的挑战,企业逐渐复苏,但这个行业仍然在经历着激烈的变革。在这个时候,我们看到了一些引人注目的技术变化和未来的趋势。 一、2023年回顾 关键词:Chat…

Springboot自定义start首发预告

Springboot自定义start首发预告 基于Springboot的自定义start , 减少项目建设重复工作, 如 依赖 , 出入参包装 , 日志打印 , mybatis基本配置等等等. 优点 模块化 可插拔 易于维护和升级 定制化 社区支持(后期支持) 发布时间 预告: 2023-12-10 预计发布: 2024-1-1 , 元旦首…

Web server failed to start. Port 8888 was already in use.

端口占用 强制终止占用端口的进程 获取占用端口的进程ID(PID):在终端或命令提示符中运行以下命令以查找占用端口的进程ID: ①在 Unix/Linux/Mac 上:lsof -i :8888 ②在 Windows 上:netstat -ano | findstr …

C# OpenCvSharp DNN 部署FastestDet

目录 效果 模型信息 项目 代码 下载 C# OpenCvSharp DNN 部署FastestDet 效果 模型信息 Inputs ------------------------- name:input.1 tensor:Float[1, 3, 512, 512] --------------------------------------------------------------- Outpu…

Gateway

网关的作用: 可以对访问的用户进行身份认证和权限校验还可以服务路由,负载均衡还可以进行请求限流 网关本身也是微服务的一部分,所以需要使用nacos进行服务注册和发现 网关路由的配置 路由id:路由唯一标识uri:路由…

配电室无人值守方案

配电室无人值守方案是在高、低压配电柜、变压器实现智能化的基础上,通过移动互联网接入电易云,建设用户侧智慧供配电云管理系统。借助手机APP、电脑WEB或监控中心大屏,实现对供配电系统的智能化安全监控与运维管理。 配电室无人值守方案的特点…

【PyTorch】现代卷积神经网络

文章目录 1. 理论介绍1.1. 深度卷积神经网络(AlexNet)1.1.1. 概述1.1.2. 模型设计 1.2. 使用块的网络(VGG)1.3. 网络中的网络(NiN) 2. 实例解析2.1. 实例描述2.2. 代码实现2.2.1. 在FashionMNIST数据集上训…

UEFI下Windows10和Ubuntu22.04双系统安装图解

目录 简介制作U盘启动盘并从U盘启动电脑安装系统安装Windows系统安装Ubuntu 附录双系统时间不一致 简介 传统 Legacy BIOS主板下的操作系统安装可参考本人博客 U盘系统盘制作与系统安装(详细图解) ,本文介绍UEFI主板下的双系统安装&#xff…

2023.12.9 关于 Spring Boot 事务传播机制详解

目录 事务传播机制 七大事务传播机制 支持当前调用链上的事务 Propagation.REQUIRED Propagation.SUPPORTS Propagation.MANDATORY 不支持当前调用链上的事务 Propagation.REQUIRES_NEW Propagation.NOT_SUPPORTED Propagation.NEVER 嵌套事务 Propagation.NESTED…