Android数据库操作

article/2025/11/3 2:25:23

Android内置了一个名为SQLite的关系型数据库,这是一款轻量型的数据库,操作十分简便。SQLite与别的数据库不同的是,它没有数据类型。可以保存任何类型的数据到你所想要保存的任何表的任何列中。但它又支持常见的类型比如: NULL, VARCHAR, TEXT, INTEGER, BLOB, CLOB…等。

唯一的例外是:integer primary key 此字段只能存储64位整数。

在JAVA项目中,要使用JDBC操作数据库需要加载数据库驱动,连接数据库等操作。Android简化了我们的数据库操作,无需由我们进行数据库驱动加载、连接等操作。

Android中进行数据库操作,需要涉及到如下几个类:

1)SQLiteOpenHelper:

在android.database.sqlite包下,这是一个抽象的帮助类,用于管理数据库的创建及版本维护操作。

我们在需要获取该类的对象时,需要自定义类继承自SQLiteOpenHelper类,并实现其中的onCreate(SQLiteDatabase), onUpgrade(SQLiteDatabase, int, int),可以选择性地实现 onOpen(SQLiteDatabase)。这个类会自动帮助我们在需要时打开数据库,在不存在时创建数据库,在必要时更新数据库。

常用方法:在这里插入图片描述
一般,在自定义的子类中调用父类中第一个构造方法即可。

构造函数的参数说明:

context:应用的上下文对象

name:要操作的数据库的名称

factory:cursor工厂类对象,一般指定为null

version:数据库的版本号,必须大于等于1,由于控制数据库的升级。
在这里插入图片描述

注意到,只有onCreate()和onUpgrade()是抽象方法,所以自定义子类继承SQLiteOpenHelper时,一定要实现这两个方法。

其中:

onCreate()方法会在数据库不存在,第一次创建时调用,所以数据库中的初始化操作,如创建表等操作需要在该方法中完成。

onUpgrade()方法,新的版本号比原来有提升时,调用,用以完成数据库的升级操作,如新版本的app中,需要添加一张表,或者修改某个表,就需要在新版本的app创建SQLiteOpenHelper对象时,向其构造函数传入一个更大的版本号,这个版本号会被newVersion接收。
在这里插入图片描述
getReadaleDatabase()方法,创建或打开一个数据库,返回代表该数据库的只读的SQLiteDatabase对象

getWritableDatabase()方法,创建或打开一个数据库,返回代表该数据库的可读可写的SQLiteDatabase对象。
在这里插入图片描述

close()方法,用于关闭打开的数据库对象。

2)SQLiteDatabase:

通过SQLiteOpenHelper对象获取SQLiteDatabase对象后,便可以调用SQLiteDatabase类的相关方法进行数据库的增删改查操作了。

该类的常用方法有:
在这里插入图片描述

execSQL()方法用于执行SQL语句,可以用于执行不需要返回值的一些数据库操作。
在这里插入图片描述
rawQuery()方法一般被用于执行需要返回值的查询操作,查询的结果保存在Cursor对象中。

除了直接执行SQL语句进行数据库操作的方法之外,该类还封装几个更易用的增删改查方法。
在这里插入图片描述

insert()方法,用于向数据库中插入数据,参数说明:

table:指定要插入数据的表明

nullColumnHack:一般指定为null即可

注意:当values也为null,表示想向数据库中插入一条空记录时,该方法实际执行的SQL语句为insert into table(null) values(null);这样一条sql语句是没法执行的,所以,需要将nullColumnHack指定为任意一个可以为空的字段的字段名。如:nullColumnHack指定为”name”,values为null,此时SQL语句为insert into table(name) values(null);则可以正常执行了。

values:是一个ContentValues对象,用于存放要插入的各个字段名与值的对应关系。
在这里插入图片描述
delete()方法,用于删除表中的记录,参数说明:

table指定要操作的表名

whereClause指定where字句,可以包含占位符”?”,如“name = ?”,实际执行时,占位符会被第三个参数中对应索引的值替换

whereArgs:指定where字句中,占位符对应的值,如new String[]{“zhangsan”}

实际执行的语句就是delete from table where name = “zhangsan”
在这里插入图片描述
update()方法,用于执行表中记录的更新操作,参数说明:

table,whereClause,whereArgs与delete相同含义

values用于指定对应字段名要更新的值的映射关系。
在这里插入图片描述

query()记录查询方法,最简单的一个重载形式也有七个参数,都是select中的各个字句部分,如where子句部分,group by子句部分,having,order by等。参数说明:

table指定要查询的表名

colmns指定要查询的字段

selection:可以带占位符的where子句部分

slectionArgs:where子句占位符对应的值

groupBy:group by子句部分

having:having子句部分

orderBy:order by 子句部分

等等
在这里插入图片描述
isOpen()判断数据库是否已打开。

在这里插入图片描述
beginTransaction()用于开启事务操作
在这里插入图片描述
setTransactionSuccessful()方法用于标记事务操作成功
在这里插入图片描述

endTransaction()方法用于关闭事务,若事务标记成功,则提交事务操作,否则,则回滚失败的事务操作。

其他方法,在需要时,可以查询API帮助手册。

3)Cursor:

Cursor是一个接口,其实现类用于存放SQL语句查询的结果集。SQLiteDatabase的rawQuery()及query()方法均会返回该接口的对象,用以存储操作查询返回的结果集。

Cursor对象维持一个游标,默认指向结果集第一条记录之前的位置,可以通过下面几个方法,来移动游标,从而取得需要的记录。当游标已在第一条记录之前,调用moveToPreious(),或者已指向最后一条记录,调用moveToNext()方法时,均会返回false()标识移动失败。
在这里插入图片描述

在这里插入图片描述
getShort()、getString()、getInt()等getXXX()方法,用于根据当前记录的字段的索引获取字段的值。
在这里插入图片描述

getColumnName()用于根据索引获取字段名

getColumnNames()用于获取所有的字段名,其顺序与在Cursor中保存的顺序相同。

getCount()用于获取当前Cursor对象中保存的记录数。
在这里插入图片描述
getColumnCount()方法用于获取记录的字段总数

getColumnIndex()用于根据字段名获取其索引,不存在时返回-1。
在这里插入图片描述

close()方法,用于关闭当前Cursor对象。

4)ContentValues:

该类用于存放键值对的数据,在数据库的插入更新等操作中,可以使用字段名作为键,使用要插入或更新的字段值作为值。

常用的是put()方法,向ContentValues对象中存储数据。

如:put(“name”,”zhangsan”);等

以上便是数据库操作所涉及的几个主要的类和接口。

下面通过一个具体的代码,来学习使用这些个API:

第一步:

自定义类继承SQLiteOpenHelper类,实现onCreate()和onUpgrade()方法:

public class MySqliteHelper extends SQLiteOpenHelper {public static final String TAG = "MYSQLITEHELPER";public static final String CREATE_STUDENT = "create table t_student (" +"id integer primary key, name varchar(20), gender varchar(10), age integer)";public MySqliteHelper(Context context, String name, CursorFactory factory,int version) {super(context, name, factory, version);}@Overridepublic void onOpen(SQLiteDatabase db) {Log.i(TAG,"open db");super.onOpen(db);}@Overridepublic void onCreate(SQLiteDatabase db) {Log.i(TAG,"create db");Log.i(TAG,"before excSql");db.execSQL(CREATE_STUDENT);Log.i(TAG,"after excSql");}@Overridepublic void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {}}

第二步,定义实体类:

package cn.csc.sqlite.bean;public class Student {private int id;private String name;private String gender;private int age;public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getGender() {return gender;}public void setGender(String gender) {this.gender = gender;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public Student() {super();}public Student(int id, String name, String gender, int age) {super();this.id = id;this.name = name;this.gender = gender;this.age = age;}@Overridepublic String toString() {return "Student [id=" + id + ", name=" + name + ", gender=" + gender+ ", age=" + age + "]";}}

第三步,定义数据库操作类:

public class StudentDao {private SQLiteOpenHelper helper;private Context context;public StudentDao(Context context){this.context = context;}public void insert(Student stu){helper = new MySqliteHelper(context,"students.db", null, 1);Log.i("MYSQLITEHELPER","before get db");SQLiteDatabase db = helper.getWritableDatabase();Log.i("MYSQLITEHELPER","after get db");db.execSQL("insert into t_student(name, gender, age) values(?,?,?)" , new Object[]{stu.getName(),stu.getGender(),stu.getAge()});db.close();}}

第四步,定义测试类,测试StudentDao的insert()方法:

public class TestDao extends AndroidTestCase {public void testInsert(){StudentDao dao = new StudentDao(getContext());dao.insert(new Student(0,"zhangsan", "male", 23));}}

运行该测试方法,运行结果如下:
在这里插入图片描述
注意到,定义SQLiteOpenHelper对象,并不会创建数据库,只有调用getWritableDatabase()或者getReadableDatabase()才会调用onCreate()方法,onCreate()内部执行了execSQL()方法,但是并没有调用onOpen()方法。onCreate()方法执行完成后,才接着调用了onOpen()方法。
在这里插入图片描述

从File Explorer中可以看出,students.db存放在/data/data/应用包名/databases/下。

再次运行,由于数据库已经存在,onCreate()方法就没再被调用。

可以通过sqlite3命令来查看数据库内容:
在这里插入图片描述
sqlite的简单使用说明:

adb shell挂载虚拟机控制台

cd /data/data/cn.csc.sqlite/databases进入数据库文件所在目录

sqlite3 数据库文件名: 管理数据库文件名所指定的数据库,如sqlite3 students.db,然后光标变为sqlite>,表示进入sqlite操作模式。

.tables 查看数据库中所有的表

可以直接输入sql语句并执行

.exit 退出sqlite操作模式

.schema 查看查看库中所有表的DDL语句

.mode list|column|insert|line|tabs|tcl|csv 改变输出格式
在这里插入图片描述

若觉得命令行用着不习惯,可以从File Explorer中把数据库文件导出到电脑中,然后使用图形化工具,如sqlite expert来查看管理数据库。

下载地址:http://pan.baidu.com/s/1jG8G7QY

StudentDao中添加getAllStudents()方法:

public List<Student> getAllStudents(){List<Student> list = new ArrayList<Student>();helper = new MySqliteHelper(context,"students.db", null, 1);SQLiteDatabase db = helper.getWritableDatabase();Cursor cursor = db.rawQuery("select id,name,gender,age from t_student", null);if(cursor == null){return null;}while(cursor.moveToNext()){Student stu = new Student(cursor.getInt(0),cursor.getString(1),cursor.getString(2),cursor.getInt(3));Log.i("MYSQLITEHELPER",stu.toString());list.add(stu);}return list;}

测试,输出:
在这里插入图片描述
上面用的都是直接写完整的SQL语句,下面添加几个方法,调用SQLiteDatabase封装的几个简单操作的API:

update()方法的使用

StudentDao类添加:修改指定id的学生的姓名:

public void updateNameById(int id, String newName){helper = new MySqliteHelper(context,"students.db", null, 1);SQLiteDatabase db = helper.getWritableDatabase();ContentValues values = new ContentValues();values.put("name", newName);db.update("t_student", values, "id=?", new String[]{id+""});}

测试代码:

public void testUpdate(){StudentDao dao = new StudentDao(getContext());dao.updateNameById(1, "dqrcsc");}

运行前后:
在这里插入图片描述
delete()方法的使用:

StudentDao类添加:删除指定id的学生

public void deleteById(int id){helper = new MySqliteHelper(context,"students.db", null, 1);SQLiteDatabase db = helper.getWritableDatabase();db.delete("t_student", "id=?", new String[]{id+""});}

测试代码:

public void testDelete(){StudentDao dao = new StudentDao(getContext());dao.deleteById(2);}

运行前后:
在这里插入图片描述

insert()方法的使用:

StudentDao类中添加如下方法:

public void addStudent(Student stu){helper = new MySqliteHelper(context,"students.db", null, 1);SQLiteDatabase db = helper.getWritableDatabase();ContentValues values = new ContentValues();values.put("name", stu.getName());values.put("gender", stu.getGender());values.put("age", stu.getAge());db.insert("t_student", null, values);}

测试代码:

public void testAddStudent(){StudentDao dao = new StudentDao(getContext());dao.addStudent(new Student(0,"csc","male",24));}

运行前后:
在这里插入图片描述

query()方法的使用:

public Student getStudentById(int id){Student stu = null;helper = new MySqliteHelper(context,"students.db", null, 1);SQLiteDatabase db = helper.getWritableDatabase();Cursor cursor = db.query("t_student", new String[]{"id","name","gender","age"}, "id=?", new String[]{id+""}, null, null, null);if(cursor == null){return null;}if(cursor.moveToFirst()){stu = new Student(cursor.getInt(0),cursor.getString(1),cursor.getString(2),cursor.getInt(3));}return stu;}

测试代码:

public void testGetStudentById(){StudentDao dao = new StudentDao(getContext());Student stu = dao.getStudentById(1);Log.i("MYSQLITEHELPER",stu.toString());}

输出:
在这里插入图片描述

关于事务的操作:

被用烂来的例子,就是银行转账问题,一个账户转出,一个账户转入,两个操作要么同时成功,要么同时失败。

这里懒得再建一张表了,就转年龄吧,其实换汤不换药,原理完全一样。

假设年龄可以在学生之间转换,我要把自己的年龄转10岁给lisi这个同学,要保证这整个操作的原子性,就需要用到事务。

在StudentDao中添加转账年龄的方法:

public void transAge(){helper = new MySqliteHelper(context,"students.db", null, 1);SQLiteDatabase db = helper.getWritableDatabase();db.execSQL("update t_student set age = age - 10 where name = ?", new String[]{"dqrcsc"});int i = 1/0;db.execSQL("update t_student set age = age + 10 where name = ?", new String[]{"lisi"});}

注意两条update语句之间有个1/0的操作,会导致程序异常终止,只有第一条被执行。

执行前后:
在这里插入图片描述

可以看到,我的年龄减去10岁,而lisi的年龄并没有加上10岁。

修改代码,改用事务处理:

public void transAge(){helper = new MySqliteHelper(context,"students.db", null, 1);SQLiteDatabase db = helper.getWritableDatabase();db.beginTransaction();try{db.execSQL("update t_student set age = age - 10 where name = ?", new String[]{"dqrcsc"});int i = 1/0;db.execSQL("update t_student set age = age + 10 where name = ?", new String[]{"lisi"});db.setTransactionSuccessful();}finally{db.endTransaction();}}

这一次,我的年龄没有减少,lisi的年龄也没有增加,保证了一致性。

关于更新数据库版本的简单示例:

如,由于业务需要,更新了APP,新版本的APP在数据库中增加了一张教师表,现在修改onCreate()方法:

public static final String CREATE_TEACHER = "create table t_teacher(id integer primary key, name varchar(20))";public void onCreate(SQLiteDatabase db) {// TODO Auto-generated method stubdb.execSQL(CREATE_STUDENT);db.execSQL(CREATE_TEACHER);}

运行,发现根本没有增加t_teacher这张表,因为数据库已存在,onCreate()方法不会被运行,这时,就需要用到onUpgrade()方法了:

public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {// TODO Auto-generated method stubif(oldVersion == 1 && newVersion == 2){db.execSQL(CREATE_TEACHER);}}

在StudentDao中添加addTeacher()方法:

public void addTeacher(){helper = new MySqliteHelper(context,"students.db", null, 2);SQLiteDatabase db = helper.getWritableDatabase();db.execSQL("insert into t_teacher(name) values(?)",new String[]{"wanger"});}

注意,这里指定的版本号为2。

测试运行结果:
在这里插入图片描述


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

相关文章

数据库基本操作

一、数据库基本操作 1.数据库的基本操作 -- 1.数据库的基本操作 使用test数据库 USE test; -- 查看当前test数据库中所有表 MySQL命令 SHOW TABLES; -- 查表的基本信息 SHOW CREATE TABLE student; -- -- 查看表的字段信息 desc student; 2.数据表的基本操作 -- 2.数据表的…

数据库基础操作

一、数据库的操作 数据库与客户端是通过网络进行交互的。 1、显示当前数据库 sql语句必须以 ; 结尾 show databases; 2、创建数据库 create database 数据库名; ->如果数据库sql敲错了&#xff0c;会有提示。 ->如果sql敲错了&#xff0c;可以按 ctrlc来终止sql。…

数据库的基本操作

目录 一、数据库的基本操作 1、数据库的登录及退出 2、查看所有数据库 3、显示数据库版本 4、显示时间 5、创建数据库 6、查看创建数据库的语句 7、查看当前使用的数据库 8、查看当前用户 9、使用某个数据库 10、删除数据库 二、数据表的基本操作 1、查看当前数据…

如何在IDEA上创建一个JSP项目【亲测有效】

idea上创建一个jsp项目 1、创建一个Java项目 2、创建成功后右击项目名称&#xff0c;点击Add Framework support 3、选择web application 选择适合版本&#xff0c;创建 4、创建成功后项目中会出现web文件夹 5、点击属性&#xff0c;进行配置 6、在project中配置jdk(你自己电脑…

Eclipse中安装配置Tomcat和创建JSP项目

这里写自定义目录标题 安装配置Tomcat创建JSP项目 安装配置Tomcat 下载并解压Tomcat到指定目录Eclipse菜单栏中找到Window–>Preperences->Server->Runtime Environments->Add 3.选择Tomcat文件夹 4.在Eclipse中找到Servers视图窗口&#xff0c;创建Tomcat服务…

springBoot+JSP搭建项目

1.springBoot对JSP的支持 springBoot虽然支持JSP&#xff0c;但是官方不建议使用&#xff0c;下面是官方文档解释 When running a Spring Boot application that uses an embedded servlet container (and is packaged as an executable archive), there are some limitations…

IntelliJ IDEA中创建jsp项目

创建java项目 首先需要创建一个普通的java项目 这一步很简单就不用多说了&#xff0c;按照正常操作来就行了 创建好的目录结果如下 创建Moudle 在IDEA中jsp项目是Project中的一个Moudle&#xff0c;因此我们就需要在jsp中创建一个moudle 然后Next 输入moudle名称 finishe…

IntelliJ IDEA 2021.1.2 x64版的 IDEA 创建 jsp项目

在创建jsp项目前需要 搭建JSP开发环境&#xff08;配置Tomcat服务器&#xff09;&#xff1a;https://blog.csdn.net/qq_51444577/article/details/118409179 1、 创建jsp项目 先创建一个项目 创建一个java项目 一直按next键&#xff0c;给项目取个名如 jsp03&#xff0c;按…

使用eclipse创建的第一个jsp项目

1.创建web项目 首先打开eclipse->file->new->Dymanic Web Project(如果没有这个选项&#xff0c;选other&#xff0c;打开搜索web) 点finish&#xff0c;web项目创建成功 2.创建jsp 进行第一个jsp页面的编写。右键选择目录下面的WebRoot文件夹&#xff0c;然后new…

Java EE之idea创建和运行jsp项目

1.点击打开Inteliij点击Create New Project 2.点击java,再左侧Project SDK选择安装的jdk路径&#xff0c;勾选WebApplication和Create web.xml。点击next 4.再新弹出的窗口中&#xff0c;Project name中填写项目名称这里写的是Web0903,对应的Project location也会创建一个Web…

JSP项目引入Vue.js进行项目开发(工程搭建)

Vue (读音 /vjuː/&#xff0c;类似于 view) 是一套用于构建用户界面的渐进式框架。与其它大型框架不同的是&#xff0c;Vue 被设计为可以自底向上逐层应用。Vue 的核心库只关注视图层&#xff0c;不仅易于上手&#xff0c;还便于与第三方库或既有项目整合。另一方面&#xff0…

eclipse创建第一个JSP项目

前言 ​ 本文的内容由四个部分组成&#xff0c;分别为①Tomcat的安装与配置&#xff0c;②创建第一个JSP项目&#xff0c;③打包JSP项目到Tomcat服务器上并在浏览器中运行&#xff0c;④eclipse的一些java Web的一些设置。 1、Tomcat安装与配置 ​ 到Tomcat官网下载Tomcat相…

Idea中新建Servlet+JSP项目

文章目录 前言一、Servlet 是什么&#xff1f;二、JSP 是什么&#xff1f;三、怎么在 IDEA 中新建 Servlet 项目&#xff1f;1. 新建项目2. 选择 Java Enterprise3. 选择 规范 Servlet步骤4. 删除不用的 pom.xml步骤5. 编辑运行配置&#xff0c;设置 JRE 总结 前言 随着学习 Ja…

jsp项目如何引入vue

如题&#xff0c;背景就不介绍了&#xff0c;项目是前后端不分离的&#xff0c;这让我一个转行前端对JSP语法不熟的人来说写起来着实难受。后来加了个考试的新功能&#xff0c;果断引入vue和element&#xff0c;还有polyfill.js&#xff0c;因为要兼容IE9。刚开始写的时候vue和…

使用eclipse开发jsp项目入门

JSP简介&#xff1a; jsp全称 Java server pages&#xff0c;是b/s &#xff08;即browser/server 浏览器/服务器&#xff09;架构软件开发使用的一种技术。开发b/s软件&#xff0c;除了使用jsp之外&#xff0c;还可以使用php &#xff0c;asp等。以上三种有互联网3P之称。当…

使用idea创建一个jsp项目

1、创建一个普通的项目 2、开始将这个普通的java项目变为一个jsp的项目 选中这个项目名&#xff0c;然后右键&#xff0c;调出菜单之后&#xff0c;选择Add Frameworks Support 进去之后选择Web Application&#xff0c;然后OK&#xff08;手贱没有截图就确定了&#xff0c;所…

idea创建jsp项目并运行

idea创建jsp项目并运行 如果未安装tomcat&#xff0c;请先安装tomcat&#xff1a;跳转至Apache Tomcat下载安装并配置 1.打开File->NEW->Project->Java Enterprise 2.在该页面中找到Projiect template挑选Web applocation 3.Applocation server->New Sever->…

idea中创建jsp项目详细步骤

安装条件&#xff1a;idea软件、tomcat10、jdk11 1、打开idea&#xff0c;在file ->new ->project中新建一个普通的java项目 ​​​​​​ 2、在项目名右键Add Framework Support选项中&#xff0c;Web Application上打勾&#xff0c;点击OK。 3、项目列表->web->…

JSP项目使用Tomcat启动

1.打开项目结构 2.新添加一个jdk,避免jar包冲突影响到其它的项目工程 3.选择jdk的本地安装文件&#xff0c;点击ok就行 4.点击号&#xff0c;找到本地的apache-tomcat的lib包下的所有jar包添加进来 5.点击应用 6.点击项目上方的编辑 7.添加tomcat服务&#xff0c;注意:是选择To…

idea 配置tomcat 运行jsp项目

1、复用idea打开jsp项目 2、添加tomcat配置 3、点击后会出现配置框,这里画框的地方都选上&#xff0c;版本选择1.8&#xff0c;其他的信息内容默认后&#xff0c;点击确认 4、点击 File->Project Structure,弹出界面选择Project&#xff0c;这里sdk选择1.8&#xff0c;语言选…