SQLite 使用(针对Android)

article/2025/10/17 9:23:24

文章目录

  • 1. SQLite 介绍
  • 2. SQLite可视化工具 安装
  • 3. SQLite的增删改查
    • 3.1 SqliteOpenHelper 创建 库或表
    • 3.2 SqliteOpenHelper 实现 增删改查

1. SQLite 介绍


在这里插入图片描述

SQLite的注意事项:

  • 标准的主键写法:_id。(不标准写法:id),此外,主键只能是Integer类型的。
  • 像varchar,char等最终内部都会转变成text格式。

android里面的SQLite数据库是由底层的sqlite.c的代码来动态生成的。

2. SQLite可视化工具 安装


官方下载地址:https://www.sqliteexpert.com/download.html

模拟器下面的db数据库查找:
在这里插入图片描述
在这里插入图片描述

3. SQLite的增删改查

3.1 SqliteOpenHelper 创建 库或表


android系统封装了一个SqliteOpenHelper抽象工具类,来对SQLite进行增删改查。

在这里插入图片描述

示例:

实现通过点击按钮,来创建一个数据库,并且数据库中带有表格的效果。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".MainActivity"android:orientation="vertical"><Buttonandroid:text="生成DB文件"android:onClick="createDB"android:layout_width="wrap_content"android:layout_height="wrap_content"/></LinearLayout>

MySqliteOpenHelper

package com.example.sqlitetest;import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import androidx.annotation.Nullable;/***  MySqliteOpenHelper 工具类 单例模式(1.构造函数私有化,2.对外提供函数。)*/
// 该类就可以理解为一个数据库了。
public class MySqliteOpenHelper extends SQLiteOpenHelper {// 单例模式private static SQLiteOpenHelper mInstance;// 提供对外提供的函数。public static synchronized SQLiteOpenHelper getInstance(Context context){if (mInstance == null){mInstance = new MySqliteOpenHelper(context,"itholmes.db",null,1);}return mInstance;}/*** 通过构造函数,将数据库名称 , 数据库版本号等定义出来。因此,必须要声明一个构造函数。* @param context context就是环境,在此环境下进行创建数据库。* @param name 数据库名称* @param factory 工厂* @param version 版本 数据库升级后需要不断加1操作!*/public MySqliteOpenHelper(@Nullable Context context, @Nullable String name, @Nullable SQLiteDatabase.CursorFactory factory, int version) {super(context, name, factory, version);}/*** 数据库初始化用的:*      创建表 表数据初始化 数据库第一次创建的时候调用。第二次发现有该表了就不会重复创建了!*      此函数只会执行一次。 因此,添加了新的数据库或者修改了数据库,必须要对应项目目录将databases目录下的db等文件删除。* @param sqLiteDatabase*/@Overridepublic void onCreate(SQLiteDatabase sqLiteDatabase) {// 创建表:person表。// 主键: _id(标准) 或者 id(不标准) 必须唯一,也可以添加自动增长 。String sql = "create table persons(" +"_id integer primary key autoincrement," +"name text" +")";// 执行sqlsqLiteDatabase.execSQL(sql);}// 数据库升级用的@Overridepublic void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {}}

MainActivity

package com.example.sqlitetest;import androidx.appcompat.app.AppCompatActivity;import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.os.Bundle;
import android.view.View;public class MainActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);}// 生成DB文件public void createDB(View view){// 通过MySqliteOpenHelper来操作SQLiteOpenHelper helper = MySqliteOpenHelper.getInstance(this);// databases数据库文件的创建,靠下面这句话。// 读SQLiteDatabase readableDatabase = helper.getReadableDatabase();// 写// SQLiteDatabase writableDatabase = helper.getWritableDatabase();}}

数据线连接到手机,开启开发者调试也可以找到:
在这里插入图片描述

注意:因为,SQLiteOpenHelper的onCreate只会加载一次,并且如果发现该数据库已经创建就不会在执行了。因此,修改了sqlite的数据库内容,再次加载前一定要删除对应databases目录下的内容。

3.2 SqliteOpenHelper 实现 增删改查


SqliteOpenHelper 实现 增删改查效果:

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".MainActivity"android:orientation="vertical"><Buttonandroid:text="生成DB文件"android:onClick="createDB"android:layout_width="wrap_content"android:layout_height="wrap_content"/><Buttonandroid:text="查询"android:onClick="query"android:layout_width="wrap_content"android:layout_height="wrap_content"/><Buttonandroid:text="插入"android:onClick="insert"android:layout_width="wrap_content"android:layout_height="wrap_content"/><Buttonandroid:text="修改"android:onClick="update"android:layout_width="wrap_content"android:layout_height="wrap_content"/><Buttonandroid:text="删除"android:onClick="delete"android:layout_width="wrap_content"android:layout_height="wrap_content"/></LinearLayout>

MySqliteOpenHelper

package com.example.sqlitetest;import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import androidx.annotation.Nullable;/***  MySqliteOpenHelper 工具类 单例模式(1.构造函数私有化,2.对外提供函数。)*/
// 该类就可以理解为一个数据库了。
public class MySqliteOpenHelper extends SQLiteOpenHelper {// 单例模式private static SQLiteOpenHelper mInstance;// 提供对外提供的函数。public static synchronized SQLiteOpenHelper getInstance(Context context){if (mInstance == null){mInstance = new MySqliteOpenHelper(context,"itholmes.db",null,1);}return mInstance;}/*** 通过构造函数,将数据库名称 , 数据库版本号等定义出来。因此,必须要声明一个构造函数。* @param context context就是环境,在此环境下进行创建数据库。* @param name 数据库名称* @param factory 工厂* @param version 版本 数据库升级后需要不断加1操作!*/public MySqliteOpenHelper(@Nullable Context context, @Nullable String name, @Nullable SQLiteDatabase.CursorFactory factory, int version) {super(context, name, factory, version);}/*** 数据库初始化用的:*      创建表 表数据初始化 数据库第一次创建的时候调用。第二次发现有该表了就不会重复创建了!*      此函数只会执行一次。 因此,添加了新的数据库或者修改了数据库,必须要对应项目目录将databases目录下的db等文件删除。* @param sqLiteDatabase*/@Overridepublic void onCreate(SQLiteDatabase sqLiteDatabase) {// 创建表:person表。// 主键: _id(标准) 或者 id(不标准) 必须唯一,也可以添加自动增长 。String sql = "create table persons(" +"_id integer primary key autoincrement," +"name text" +")";// 执行sqlsqLiteDatabase.execSQL(sql);}// 数据库升级用的@Overridepublic void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {}}

MainActivity

package com.example.sqlitetest;import androidx.appcompat.app.AppCompatActivity;import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.os.Bundle;
import android.util.Log;
import android.view.View;public class MainActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);}// 生成DB文件public void createDB(View view){// 通过MySqliteOpenHelper来操作SQLiteOpenHelper helper = MySqliteOpenHelper.getInstance(this);// databases数据库文件的创建,靠下面这句话。// 读SQLiteDatabase readableDatabase = helper.getReadableDatabase();// 写// SQLiteDatabase writableDatabase = helper.getWritableDatabase();}// sql 查询语句public void query(View view){// helper单例模式,因此随便调用。SQLiteOpenHelper helper = MySqliteOpenHelper.getInstance(this);// 查询调用getReadableDatabase就行。SQLiteDatabase db = helper.getReadableDatabase();// db.isOpen():如果db数据库是打开的,就返回true,反之返回false。if (db.isOpen()){// rawQuery方法进行查询,并且返回了一个Cursor游标。Cursor cursor = db.rawQuery("select * from persons", null);// 迭代游标// cursor.moveToNext()就是让游标下移,遍历数据。while (cursor.moveToNext()){// 可以直接通过索引获取。// int anInt = cursor.getInt(0);// 也可以通过cursor.getColumnIndex("_id")这种形式来获取,容错率大一点。int id = cursor.getInt(cursor.getColumnIndex("_id"));String name = cursor.getString(cursor.getColumnIndex("name"));Log.d("itholmes","_id:"+ id + ",name" + name);}// 一定记得关闭游标,否则耗费性能!cursor.close();// 数据库也要关闭!db.close();}}public void insert(View view) {// helper单例模式,因此随便调用。SQLiteOpenHelper helper = MySqliteOpenHelper.getInstance(this);// 增删改都需要调用getWritableDatabaseSQLiteDatabase db = helper.getWritableDatabase();if (db.isOpen()){// 插入语句String sql = "insert into persons(name) values ('张三')";db.execSQL(sql);}// 关闭数据库db.close();}// 修改public void update(View view) {// helper单例模式,因此随便调用。SQLiteOpenHelper helper = MySqliteOpenHelper.getInstance(this);// 增删改都需要调用getWritableDatabaseSQLiteDatabase db = helper.getWritableDatabase();if (db.isOpen()){String sql = "update persons set name = ? where _id = ?";// 添加参数db.execSQL(sql,new Object[]{"李四",1});}db.close();}// 删除public void delete(View view) {// helper单例模式,因此随便调用。SQLiteOpenHelper helper = MySqliteOpenHelper.getInstance(this);// 增删改都需要调用getWritableDatabaseSQLiteDatabase db = helper.getWritableDatabase();if (db.isOpen()){String sql = "delete from persons where _id = ?";db.execSQL(sql,new Object[]{1});}db.close();}
}

http://chatgpt.dhexx.cn/article/N3JjWNdD.shtml

相关文章

AXI 总线入门(一)通道握手-AXI-Lite

AXI 总线(一)通道握手-AXI-Lite 文章目录 AXI 总线(一)通道握手-AXI-Lite关于本系列教程什么是AXI协议AXI读写通道AXI读过程AXI写过程单一通道的握手VALID 信号先到READY信号先到READY和VALID同时到达原则性问题 AXI-Lite总线实现解析生成一个AXI(-Lite)外设整体端口信号解析A(…

【AXI】解读AXI协议乱序机制

芯片设计验证社区芯片爱好者聚集地硬件相关讨论社区数字verifier星球四社区联合力荐&#xff01;近500篇数字IC精品文章收录&#xff01;【数字IC精品文章收录】学习路线基础知识总线脚本语言芯片求职EDA工具低功耗设计VerilogSTA设计验证FPGA架构AMBA书籍 解读AXI协议乱序机制…

AXI协议(数据传输结构)

AXI协议关于Data read and write structure的部分指出&#xff0c;在数据传输过程中&#xff0c;主要涉及三个问题&#xff1a; 窄位宽数据传输&#xff08;Narrow transfers&#xff09;地址非对齐传输&#xff08;Unaligned Transfer&#xff09;混合大小端传输&#xff08;…

AXI总线代码详细整理(一)

目录 说明1. AXI 的时钟与复位1.1 时钟1.2 复位 2. 五个通道2.1 Write Address Channel2.2 Write Data Channel2.3 Write Response (B) Channel2.4 Read Address Channel2.5 Read Data (and Response) Channel 3 突发传输机制3.1 突发传输长度和宽度3.2 突发传输类型 说明 文字…

AXI总线详解完结篇

经过几个月的整理和发文,AXI总线详解系列正式迎来最终篇,内容基本涵盖了上一篇文章的全部内容。 所有文章的链接如下: 1、 AXI总线详解 2、AXI总线详解-总线和接口以及协议 3、AXI协议中的通道结构 4、AXI总线详解-AXI4读

AXI接口简介

此部分&#xff0c;有参考他人帖子的内容&#xff0c;加上自己的理解&#xff0c;感恩原作者 1、 AXI&#xff08;Advanced eXtensible Interface&#xff09;协议主要描述了主设备&#xff08;Master&#xff09;和从设备&#xff08;Slave&#xff09;之间的数据传输方式&…

AXI接口协议详解-AXI总线、接口、协议

转自&#xff1a;https://cloud.tencent.com/developer/article/1695010 AXI接口协议详解-AXI总线、接口、协议 AXI 总线 上面介绍了AMBA总线中的两种&#xff0c;下面看下我们的主角—AXI&#xff0c;在ZYNQ中有支持三种AXI总线&#xff0c;拥有三种AXI接口&#xff0c;当然用…

【AXI】解读AXI协议的低功耗设计

芯片设计验证社区芯片爱好者聚集地硬件相关讨论社区数字verifier星球四社区联合力荐&#xff01;近500篇数字IC精品文章收录&#xff01;【数字IC精品文章收录】学习路线基础知识总线脚本语言芯片求职EDA工具低功耗设计VerilogSTA设计验证FPGA架构AMBA书籍 解读AXI协议的低功耗…

AXI总线协议

0.绪论 AXI(Advanced eXtensible Interface)是一种总线协议,该协议是ARM公司提出的AMBA3.0中最重要的部分,是一种面向高性能、高带宽、低延迟的片内总线。AMBA4.0将其修改升级为AXI4.0。 AMBA4.0 包括AXI4.0、AXI4.0-lite、ACE4.0、AXI4.0-stream。 AXI4.0-lite是AXI的简化…

AXI总线学习------从零开始详细学-----------连载(2)axi protocol 通道分类

AXI总线学习连载&#xff08;2&#xff09; 鲁迅曾经说过&#xff1a; 学硬件&#xff0c;不是学哪里查哪里&#xff0c;有一些东西是必须系统的学的&#xff0c;不管是嵌入式还是FPGA,硬件学习的积累一定要是系统的。 我也曾经说过&#xff1a; 英文手册非常重要&#xff0c…

【AXI】解读AXI协议中的burst突发传输机制

芯片设计验证社区芯片爱好者聚集地硬件相关讨论社区数字verifier星球四社区联合力荐&#xff01;近500篇数字IC精品文章收录&#xff01;【数字IC精品文章收录】学习路线基础知识总线脚本语言芯片求职EDA工具低功耗设计VerilogSTA设计验证FPGA架构AMBA书籍 解读AXI协议中的burs…

【AXI】解读AXI协议事务属性(Transaction Attributes)

芯片设计验证社区芯片爱好者聚集地硬件相关讨论社区数字verifier星球四社区联合力荐&#xff01;近500篇数字IC精品文章收录&#xff01;【数字IC精品文章收录】学习路线基础知识总线脚本语言芯片求职EDA工具低功耗设计VerilogSTA设计验证FPGA架构AMBA书籍 解读AXI协议事务属性…

AXI总线知多少?

关注、星标公众号&#xff0c;精彩内容每日送达 来源&#xff1a;数字ICer 前言 本文针对秋招面试高频问题: AXI总线进行总结&#xff1b; 1.简介 AXI是个什么东西呢&#xff0c;它其实不属于Zynq&#xff0c;不属于Xilinx&#xff0c;而是属于ARM。它是ARM最新的总线接口&…

AXI学习

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 一、AXI中关于非对齐问题理解 AXI 协议支持地址非对齐的传输&#xff0c;允许突发传输的首字节地址&#xff0c;即起始地址与突发传输位宽不对齐。举个例子&#xff0c;总线位…

AXI 中文

AXI总线协议资料整理 第一部分&#xff1a; 1、AXI简介&#xff1a;AXI&#xff08;AdvancedeXtensible Interface&#xff09;是一种总线协议&#xff0c;该协议是ARM公司提出的AMBA&#xff08;AdvancedMicrocontroller Bus Architecture&#xff09;3.0协议中最重要的部分&a…

AXI协议

文章目录 前言一、通道信号二、AXI 握手机制三、读写Timing3.1 写数据3.2 读数据 四、通道间的依赖关系4.1 写地址通道&#xff08; AW &#xff09;4.2 写数据通道&#xff08; W &#xff09;4.2 写响应通道( B )4.3 读数据( R ) 五、信号详细解释5.1 ACLK和ARESETn5.2 Burst…

AXI 总线详解

综述 本文我们详解AXI&#xff0c;在ZYNQ中有支持三种AXI总线&#xff0c;拥有三种AXI接口&#xff0c;当然用的都是AXI协议。其中三种AXI总线分别为&#xff1a; AXI4&#xff1a;&#xff08;For high-performance memory-mapped requirements.&#xff09;主要面向高性能地…

AXI总线概述

AXI&#xff08;Advanced eXtensible Interface&#xff09;是一种总线协议&#xff0c;该协议是ARM公司提出的AMBA3.0中最重要的部分&#xff0c;是一种面向高性能、高带宽、低延迟的片内总线。AMBA4.0将其修改升级为AXI4.0。 AMBA4.0 包括AXI4.0、AXI4.0-lite、ACE4.0、AXI4.…

AXI协议学习笔记~~

AXI总线简介 ​  AXI属于AMBA(The ARM Advanced Microcontroller Bus Architecture)家族的一员&#xff0c;AXI协议在AMBA3.0版本中开始出现&#xff0c;并在后续的AMBA4.0&#xff0c;AMBA5.0中持续更新&#xff0c;对应为 AXI3&#xff0c;AXI4&#xff0c;AXI5。 ​   …

AXI 系列 之 AXI概述

目录 AXI简介 AMBA总线的演进图 AXI overriew AXI读写通道 AXI读取传输 事务 AXI 写入传输事务 AXI 概念解读 burst传输 FIXED模式下传输首地址后就可以不停传输数据吗&#xff1f; 突发传输不能跨4KB边界&#xff1f; 非对齐传输 复位期间对接口有如下要求&#xf…