Android SQLite的使用

前言

本文用于介绍SQLite,SQLite是Android内置的数据库,是一款轻量级的关系型数据库。它具有运算速度快、占用资源少等优点。支持SQL语法同时遵循数据库的ACID事务。

创建数据库

Android为我们提供了一个SQLiteOpenHelper帮助类,我们可以在这里面实现创建数据库、升级数据库的逻辑。在SQLiteOpenHelper里面,有两个非常重要的方法:getReadabledatabase()和getWriteableDatabase(),这两个方法都可以打开一个现有的数据库(存在该数据库则打开,不存在则创建),并返回一个可以对数据库进行读写操作的对象(SQLiteDatabase)。不同点是当数据库不可写入时(如磁盘空间满了),getReadabledatabase()将以只读的方式打开数据库,而getWriteableDatabase()方法将出现异常。

下面我们来构建一个SQLiteOpenHelper实例,取名为MyDatabaseHelper,这里我们希望创建一个名为BookStore.db的数据库,数据库中有一张叫Book的表。

public class MyDatabaseHelper extends SQLiteOpenHelper{public static final String CREATE_BOOK="create table Book("+"id integer primary key autoincrement,"+"author text,"+"price real,"+"pages integer,"+"image blob,"+"name text)";private Context mContext;public StatusDatabase(@Nullable Context context, @Nullable String name, @Nullable SQLiteDatabase.CursorFactory factory, int version) {super(context, name, factory, version);mContext=context;}@Overridepublic void onCreate(SQLiteDatabase db) {db.execSQL(CREATE_BOOK);//创建成功时弹出Create succeedToast.makeText(mContext,"Create succeed",Toast.LENGTH_SHORT).show();}//用于对数据库进行升级时@Overridepublic void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {}
}

这里简单介绍一下CREATE_BOOK的建表语句:首先字段在前,数据类型在后,我们还可以给字段设置一些特殊的属性,例如id字段primary key表示设置id为主键,autoincrement表示id是自增长的,其他的感兴趣可以自己去查找。另外讲一下数据类型,integer表示整型,text表示文本型,real表示浮点数,blob表示二进制类型,常用它来存储图片数据(最后会具体讲解)。

接下来我们只需创建出MyDatabaseHelper实例并调用它的getWriteableDatabase()方法来创建数据库即可:

MyDatabaseHelper dbHelper=new MyDatabaseHelper(this,"BookStore.db",null,1);

BookStore.db表示创建出的数据库的名字叫做BookStore.db,1表示数据库版本是1,后续我们升级了数据库版本也会随之改变。

升级数据库

我们在编写MyDatabaseHelper时还有一个方法onUpgrade()没编写,它就是用来进行数据库升级的,例如此刻我们想加入一张新的表Category用来表示书的分类,在编写好Category的建表语句后,只需在onCreate()方法里像创建Book表一样创建Category表(db.execSQL(CREATE_CATEGORY)),接着我们要在onUpgrade()方法中删除原来创建好的表再重新创建表,要不然程序会报错,如下:

@Overridepublic void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {db.execSQL("drop table if exists Book");db.execSQL("drop table if exists Category");onCreate(db);}

接着我们要再想创建出MyDatabaseHelper的实例并调用它的getWriteableDatabase()方法来创建数据库,版本号就要传入2了:

MyDatabaseHelper dbHelper=new MyDatabaseHelper(this,"BookStore.db",null,2);

添加数据

上面说到过,要想对数据库进行操作,我们要调用getReadabledatabase()或getWriteableDatabase()方法打开数据库,并且该方法会返回一个数据库操作对象,如下:

SQLiteDatabase db=dbHelper.getWriteableDatabase();
ContentValues cv=new ContentValues();//用于对要添加的数据进行组装
cv.put("name","zhangsan");
cv.put("price",12.12);
...
db.insert("Book",null,cv);//调用insert方法将数据插入到Book表中

这样数据就存到了我们的Book表中,上面要想继续向Category表中存数据,只需先调用cv.clear()方法将cv中的数据清空,然后重复cv.put()、db.insert()即可

关于图片的存储与读取放在后面具体来讲解。

更新数据

更新数据时我们还是先获取一个ContentValues对象来对数据进项组装,与上面不同的是这次我们是调用update()方法

SQLiteDatabse db=dbHelper.getWriteableDatabse();
ContentValues cv=new ContentValues();
values.put("price",10.00);//将price字段12.12改为10.00
db.update("Book",cv,"name=?",new String[]{"zhangsan"});//条件是name=zhangsan
//完整的是将name=zhangsan的一条数据中的price由12.12改为10.00

当然update()方法后面你也可以传两个null进去表示没有条件

删除数据

获取到数据库操作对象直接执行删除操作

SQLiteDatabse db=dbHelper.getWriteableDatabse();
db.delete("Book","pages>?",new String[]{"500"});//删除pages大于500的数据

查询数据

书上的查询讲了非常多内容,我们查询的query()方法有六个方法,对应了查询的约束条件、分组条件等等,这里不用害怕,我们只需掌握最基础的查询即可,因为以后这些查询操作都是交给后端来实现的,这里我就介绍一下最简单的查询。

调用query()方法会给我们返回一个Cursor对象,查询到的所有数据都从这个对象中取出。

SQLiteDatabse db=dbHelper.getWriteableDatabse();
Cursor cursor=db.query("Book",null,null,null,null,null,null);
if(cursor.moveToFirst()){//遍历Cursor对象,取出查询到的所有数据do{String bookName=cursor.getString(cursor.getColumnIndex("name"));//查询字段名为name的字段将值赋给bookNameint bookPages=cursor.getInt(cursor.getColumnIndex("pages"));//查询字段名为pages的字段将值赋给bookPagesdouble bookPrice=cursor.getDouble(cursor.getColumnIndex("price"));//查询字段名为price的字段将值赋给bookPrice}while(cursor.moveToNext());
}
cursor.close();

使用SQL操作数据库

Android为我们提供了直接使用SQL来操作数据库。

  • 添加数据
db.execSQL("insert into Book(name,author,pages,price) values(?,?,?,?)"new String[]{"..","..","..",".."});
  • 更新数据
db.execSQL("update Book set price=? where name=?",new String[]{"..",".."});
  • 删除数据
db.execSQL("dlete from Book where Pages>?"new String[]{"500"});
  • 查询数据
db.rawQuery("select * from Book",null);

图片的存与取

要保存的图片类型一定要是Bitmap类型的

//字节输出流,保存图片
ByteArrayOutputStream os = new ByteArrayOutputStream();
//bitmap为要保存到数据库的对象
bitmap.compress(Bitmap.CompressFormat.PNG, 1, os);SQLiteDatabase db=dbHelper.getWritableDatabase();
ContentValues cv=new ContentValues();
cv.put("image",os.toByteArray());
db.insert("Book",null,cv);
SQLiteDatabase db=dbHelper.getWritableDatabase();
Cursor cursor=db.query("Book",null,null,null,null,null,null,null);
f (cursor.moveToFirst()){do {byte[] data = cursor.getBlob(cursor.getColumnIndex("image"));bitmap=BitmapFactory.decodeByteArray(data, 0, data.length);//将图片设置进iv图片iv.setImageBitmap(bitmap);}while(cursor.moveToNext());
}
cursor.close();

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

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

相关文章

MTU/TCPMSS/VLAN/ACCESS/TRUNK/HYBRID

MTU RFC标准定义以太网的默认MTU值为1500 最小64字节是为了保证最极端的冲突能被检测到,64字节是能被检测到的最小值;最大不超过1518字节是为了防止过长的帧传输时间过长而占用共享链路太长时间导致其他业务阻塞。所以规定以太网帧大小为64~1518字节&am…

OpenFeign使用

OpenFeign天然支持负载均衡 想要去消费接口的API的服务引入pom依赖 <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId> </dependency> 主启动类上加注解 EnableFeignC…

C++入门(二)

目录 函数重载&#xff1a; 函数重载概念&#xff1a; 参数类型不同&#xff1a; 参数个数不同&#xff1a; 参数类型顺序不同&#xff1a; C支持函数重载的原理--名字修饰&#xff1a; 引用&#xff1a; 引用概念&#xff1a; 引用特性&#xff1a; 常引用&#xff1…

网页的血液——javascript

1.简介 网络开发唯一可选语言&#xff0c; 增加网页动态性与交互性&#xff0c;服务端开发&#xff0c; Nodejs&#xff0c;可以进行数据库文件读写 2.引入 html内部使用script标签&#xff0c;在script内部直接编写js 在外部js文件中编写&#xff0c;在script内部通…

JJJ:linux系统中第一个进程

以linux4.19内核linux系统中第一个进程。 执行shell指令 ps -ef 结果如下&#xff1a; xxxxxx-virtual-machine:~$ ps -ef UID PID PPID C STIME TTY TIME CMD root 1 0 0 20:55 ? 00:00:02 /sbin/init splash root …

【机器学习300问】58、什么是词袋模型和N-gram模型?

词袋模型&#xff08;Bag of Words, BoW&#xff09;和N-gram模型主要用于早期的自然语言处理任务&#xff0c;上文中我介绍了机器是如何读懂文本的四个阶段&#xff0c;这篇文章带大家来看看在不同阶段中会用到的两个模型——词袋模型和N-gram模型。如果没有读过我之前的文章&…

C语言二进制常用逻辑运算符介绍与使用

在C语言中&#xff0c;二进制常用的逻辑运算符包括与&#xff08;AND&#xff09;、或&#xff08;OR&#xff09;、非&#xff08;NOT&#xff09;&#xff0c;以及异或&#xff08;XOR&#xff09;。以下是它们的介绍和使用方法&#xff1a; 与&#xff08;AND&#xff09;&a…

Nodejs 第六十章(http缓存)

HTTP缓存 HTTP 缓存主要分为两大类&#xff1a;强缓存和协商缓存。这两种缓存都通过 HTTP 响应头来控制&#xff0c;目的是提高网站性能。 强缓存介绍 强缓存之后则不需要向服务器发送请求&#xff0c;而是从浏览器缓存读取分为&#xff08;内存缓存&#xff09;| &#xff…

HarmonyOS 应用开发之FA模型与Stage模型应用组件

应用配置文件概述&#xff08;FA模型&#xff09; 每个应用项目必须在项目的代码目录下加入配置文件&#xff0c;这些配置文件会向编译工具、操作系统和应用市场提供描述应用的基本信息。 应用配置文件需申明以下内容&#xff1a; 应用的软件Bundle名称&#xff0c;应用的开发…

《Long-CLIP: Unlocking the Long-Text Capability of CLIP》

论文:https://arxiv.org/pdf/2403.15378.pdf源码:https://github.com/beichenzbc/Long-CLIP 导读 CLIP(Contrastive Language–Image Pre-training),这个由 OpenAI 团队开源的多模态预训练模型,它通过对比学习的方式,同时学习图像和文本的表示,从而实现在没有针对特定…

坐标变换矩阵之平移-opencv

平移矩阵m&#xff0c;平移向量(tx,ty,tz) double tx10.2; double ty0.0; double tz0.0; cv::Mat m cv::Mat::eye(4, 4, CV_64FC1);//单位矩阵 m.at<double>(0,3)tx; m.at<double>(1,3)ty; m.at<double>(2,3)tz;齐次点p(1,0,0,1)&#xff0c; cv::Mat p(4…

ESD保护二极管ESD9B3.3ST5G 以更小的空间实现强大的保护 车规级TVS二极管更给力

什么是汽车级TVS二极管&#xff1f; TVS二极管是一种用于保护电子电路的电子元件。它主要用于电路中的过电压保护&#xff0c;防止电压过高而损坏其他部件。TVS二极管通常被称为“汽车级”是因为它们能够满足汽车电子系统的特殊要求。 在汽车电子系统中&#xff0c;由于车辆启…

SEO文章写作器,批量写作原创SEO收录文章

在当今数字化时代&#xff0c;搜索引擎优化&#xff08;SEO&#xff09;已经成为了网站获得流量和曝光度的关键手段之一。而在SEO领域中&#xff0c;内容的质量和原创性是至关重要的。为了应对不断增长的内容需求&#xff0c;越来越多的人开始转向AI写作生成器&#xff0c;这些…

ChatGPT如何升级为GPT-4在国内

通过 WildCard 可以把ChatGPT升级为GPT-4 地址 1: 2155 Bailey Hill Rd 城市: Eugene 邮编: 97405 州: Oregon ChatGPT Plus/Team 一键升级&#xff0c;几分钟即可自动升级到 ChatGPT Plus。 选择我的邮箱账号符合要求 复制这个页面的链接即可 复制上面的link 到请在…

32-4 APP渗透 - APP渗透与防御

一、APP渗透测试流程 准备阶段: 确定安全测试的范围,包括受测方的测试目标和敏感数据。获取被测单位的书面盖章渗透测试授权,确保合法性和透明度。(重要)信息搜集: 收集关于APP的环境、业务用例和架构等信息,了解目标系统的特点和运行环境。可以使用各种信息收集工具和技术…

通俗易懂:什么是Java虚拟机(JVM)?它的主要作用是什么?

Java虚拟机&#xff08;Java Virtual Machine, JVM&#xff09;是一种软件实现的抽象计算机&#xff0c;它负责执行Java字节码&#xff08;Bytecode&#xff09;。Java程序并不是直接在物理计算机上运行&#xff0c;而是先由Java编译器将源代码编译成与平台无关的字节码&#x…

基于springboot实现房产销售系统项目【项目源码+论文说明】计算机毕业设计

基于springboot实现房产销售系统演示 摘要 随着科学技术的飞速发展&#xff0c;各行各业都在努力与现代先进技术接轨&#xff0c;通过科技手段提高自身的优势&#xff1b;对于房产销售系统当然也不能排除在外&#xff0c;随着网络技术的不断成熟&#xff0c;带动了房产销售系统…

CI/CD实战-jenkins结合ansible 7

配置主机环境 在jenkins上断开并删除docker1节点 重新给master添加构建任务 将server3&#xff0c;server4作为测试主机&#xff0c;停掉其上后面的docker 在server2&#xff08;jenkins&#xff09;主机上安装ansible 设置jenkins用户到目标主机的免密 给测试主机创建用户并…

MySQL8 搭建集群方案文档

MySQL8.0.21 InnoDB Cluster 从零搭建集群方案详细文档 InnoDB集群 本文档分享新版本MySQL 8.0.21 Innodb Cluster集群搭建过程 ~ MySQL InnoDB Cluster为MySQL提供了完整的高可用性解决方案。通过使用MySQL Shell附带的AdminAPI&#xff0c; 您可以轻松地配置和管理一组至少…

【力扣hot100】128-最长连续序列、283-移动零

128. 最长连续序列 import java.util.*;public class Test {public static void main(String[] args) {int[] nums {0, 3, 7, 2, 5, 8, 4, 6, 0, 1};int res new Solution().longestConsecutive(nums);System.out.println(res);} }class Solution {public int longestConsecu…