精华内容
下载资源
问答
  • Java_DB_Book-源码

    2021-07-12 19:12:17
    Java_DB_Book 此应用程序将允许您插入、删除和查看您选择的书籍的信息。 您放入的图书的代码、价格、名称和Y/N等信息将存储在数据库中。 但是您应该先创建数据库并运行此应用程序。
  • Mysql创建数据库

    2021-01-18 18:41:07
    顺利连接到mysql服务器后,就可以使用数据定义语言(DDL)定义和管理数据对象了,包括数据库、表、索引和视图。在建立数据表之前,首先应该先创建个数据库,...#创建一个名为shop的数据库这个操作用于创建数据库,并进行命...

    21410dbce025ff165fbd6c4198da1931.png

    顺利连接到mysql服务器后,就可以使用数据定义语言(DDL)定义和管理数据对象了,包括数据库、表、索引和视图。在建立数据表之前,首先应该先创建个数据库,基本的建立数据库语句命令比较简单。 例如为商店创建一个名为shop的数据库,需要在MySQL控制台输入以下命令

    CREATE DATABASE [IF NOT EXISTS] shop;#创建一个名为shop的数据库

    这个操作用于创建数据库,并进行命名。如果要使用CREATE DATABASE语句,需要获得数据库CREATE权限。在命名数据库及数据表、字段或索引时,应该使用能够表达明确语意的英文拼写,并且应当避免名称之间的冲突。在一些大 小写敏感的操作系统中,例如linux中命名是时也应该考虑大小写的问题。如果存在数据库,并且没有指定IF NOTE EXISTS,则会出现错误。如果需要删除一个指定的数据库,可以在MySQL控制台使用下面的语句 “`

    DROP DATABASE [IF EXISTS] shop;

    这个操作将删除指定数据库的所有内容,包括该数据库中的表、索引的各种信息,并且这是一个不可恢复的操作,因此使用此语句时要非常谨慎。如果要使用DROP DATABASE语句,也需要获得数据库DROP权限。IF EXISTS 用于防止当数据库不存在时发生错误。如果需要查看数据库是否建立,则可以使用MySQL控制台中的提示符输入以下命令 ```

    SHOW DATABASES;

    如果看到已创建的数据库,就可以使用USE命令打开这个数据库作为默认数据库使用,用于后续语句。该数据库保持为默认数据库,直到语段的结尾,或者直到使用下一个USE语句选择其他数据库时,命令如下

    USE shop

    原创文章转载请注明:转载自:Mysql创建数据库

    展开全文
  • Python自带一个轻量级的关系型数据库SQLite。这一数据库使用SQL语言。SQLite作为后端数据库,可以搭配Python建网站,或者制作有数据存储需求的工具。SQLit...文章vamei2014-06-22802浏览量pyt...

    Python标准库14 数据库 (sqlite3)

    作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明。谢谢!

    Python自带一个轻量级的关系型数据库SQLite。这一数据库使用SQL语言。SQLite作为后端数据库,可以搭配Python建网站,或者制作有数据存储需求的工具。SQLit...

    文章

    vamei

    2014-06-22

    802浏览量

    python中的SQLite数据库

    python中的SQLite数据库

    Python SQLITE数据库是一款非常小巧的嵌入式开源数据库软件,也就是说没有独立的维护进程,所有的维护都来自于程序本身。它使用一个文件存储整个数据库,操作十分方便。它的最大优点是使用方便,功能相比于其它大型数据库来说,确实有些差距。但是性能表现上,SQL...

    文章

    幸运券发放

    2018-05-03

    1289浏览量

    SQLite介绍

    SQLite介绍

    SQLite是一个用C语言书写的小型库,它提供了数据库SQL引擎并实现了大部分的标准SQL92和ACID特性。与数据库服务器如MySQL或PostgreSQL相比较,它的特殊性,在于不是复制客户机/服务器结构,而是通过使用数据库文件直接集成到程序中。SQLite是D. R...

    文章

    jieforest

    2013-09-30

    624浏览量

    万券齐发助力企业上云,爆款产品低至2.2折起!

    限量神券最高减1000,抢完即止!云服务器ECS新用户首购低至0.95折!

    广告

    01.SQLite 教程(http://www.w3cschool.cc/sqlite/sqlite-tutorial.html)

    SQLite 教程

    SQLite 是一个软件库,实现了自给自足的、无服务器的、零配置的、事务性的 SQL 数据库引擎。SQLite 是在世界上最广泛部署的 SQL 数据库引擎。SQLite 源代码不受版权限制。

    本教程将告诉您如何使用 SQLite 编程,并让你迅速上手。

    现在开始学习 ...

    文章

    涂作权

    2014-11-08

    1263浏览量

    SQLite介绍

    版权声明:本文为博主chszs的原创文章,未经博主允许不得转载。https://blog.csdn.net/chszs/article/details/4165824

    SQLite介绍

    SQLite是一个用...

    文章

    chszs

    2009-05-10

    663浏览量

    Python操作SQLite数据库

    连接数据库

    从2.5版本开始,Python的标准库中就有了一个专门用于SQLite的sqlite3模块。连接SQLite数据库方式如下:

    import sqlite3 as dbapi

    con = dbapi.connect('population.db')

    cur = con.curso...

    文章

    楚兴

    2015-04-06

    848浏览量

    Python连接SQLite

    Python 连接 SQLite

    记录自己学习Python的代码。每天进步一点点,目标距离缩小点。

    #! /usr/bin/python3

    #-*- coding: utf-8 -*-

    import sqlite3

    # 在 磁盘上创建数据库

    # with sqlite3.connect('\\w...

    文章

    虎眼豆丁

    2018-11-22

    1041浏览量

    Win7下SQLite的简单使用

    前言

    SQLite 是一个软件库,实现了自给自足的、无服务器的、零配置的、事务性的 SQL 数据库引擎。SQLite 是在世界上最广泛部署的 SQL 数据库引擎。SQLite 源代码不受版权限制。

    简单的认识了SQLite之后,我就很想来尝试一下,他如此的轻量,作为一个程序员,我没有理...

    文章

    aehyok

    2014-10-08

    737浏览量

    使用 Python 的 SQLite JSON1 和 FTS5 扩展

    早在九月份,编程界出现一个名为 json1.c 的文件,此前这个文件一直在 SQLite 的库里面。还有,笔者也曾总结通过使用新的 json1 扩展来编译 pysqlite 的技巧。但现在随着 SQLite 3.9.0 的发布,用户已经不用再费那么大劲了。

    SQLite 3.9.0 版本做了很大...

    文章

    oneapm_official

    2015-12-24

    2669浏览量

    Django如何在数据库中创建表

    1.前提是你安装了Django框架在你的项目中运行Django ZIP文件中的python Setup.py install

    2.前提是你已经安装了MySQLdb这个框架在你的项目中1.2.2(直接有EXE文件)

    3.前提是你已经安装了PIL-1.1.7.win32-py2.6.exe图片数据库在...

    文章

    自娱

    2016-04-07

    3028浏览量

    Python操作SQLite数据库

    连接数据库

    从2.5版本开始,Python的标准库中就有了一个专门用于SQLite的sqlite3模块。连接SQLite数据库方式如下:

    import sqlite3 as dbapi

    con = dbapi.connect('population.db')

    cur = con.cursor()

    ...

    文章

    shy丶gril

    2016-05-18

    1704浏览量

    Android 开发中使用 SQLite 数据库

    SQLite 是一款非常流行的嵌入式数据库,它支持 SQL 查询,并且只用很少的内存。Android 在运行时集成了 SQLite,所以每个 Android 应用程序都可以使用 SQLite 数据库。对数熟悉 SQL 的开发人员来时,使用 SQLite 相当简单。可以,由于 JDBC 不适合手机这...

    文章

    沉默术士

    2017-07-03

    1390浏览量

    HelloDjango 系列教程:Django 迁移、操作数据库

    HelloDjango 系列教程:Django 迁移、操作数据库

    文中涉及的示例代码,已同步更新到 HelloGitHub-Team 仓库

    我们已经编写了博客数据库模型的代码,但那还只是 Python 代码而已,django 还没有把它翻译成数据库语言,因此实际上这些数据库表还没有真正的在数据库中...

    文章

    优惠码领取

    2019-08-01

    773浏览量

    Python 和 Pandas 在 SQLite 数据库中的运用

    本文讲的是Python 和 Pandas 在 SQLite 数据库中的运用,

    SQLite 是一个数据库引擎,使用它能方便地存储和处理关系型数据。它和 csv 格式很相似,SQLite 把数据存储在一个单独的文件中,它能方便地与其他人共享。大部分的编程语言和编译环境都对 SQLite 数据库提...

    文章

    玄学酱

    2017-10-18

    3341浏览量

    Django: 数据库迁移和管理

    startup-photos.jpg

    数据库迁移

    写完数据库模型之后,要根据这个模型创建数据库。目前Django支持如下数据库引擎:

    MySQL: django.db.backends.mysql

    SQLite 3: django.db.backends.sqlite3

    PostgreSQ...

    文章

    徐洲更

    2017-06-24

    703浏览量

    Django 博客开发教程 4 - 让 Django 完成翻译:迁移数据库

    我们已经编写了博客数据库模型的代码,但那还只是 Python 代码而已,Django 还没有把它翻译成数据库语言,因此实际上这些数据库表还没有真正的在数据库中创建。

    迁移数据库

    为了让 Django 完成翻译,创建好这些数据库表,我们再一次请出我的工程管理助手 manage.py。激活虚拟环境,切...

    文章

    追梦人物

    2017-05-26

    1617浏览量

    sqlite简明教程

    本文的主要目的是作为一个入门级教程,教你一些如何使用PySqlite来操作 Sqite

    的一些基本的语句,更详细的还要去参考想应的文档以及编写相应的测试程序。希望本文对你有帮助。

    我以前的Blog sqlite一个轻巧的数据库

    PySqlite的主页地址:http://pysqlite.sou...

    文章

    x3d

    2009-07-28

    768浏览量

    python进阶学习笔记(三)

    本节通过SQLite了解数据库操作

    -------------------------

    数据库支持

    使用简单的纯文本只能实现有退限的功能,所需要引入数据库,完成更强大的功能,本节使用的简单数据库SQLite 。

    SQLite 和PySQLite

    sqlite是非常著名的开...

    文章

    虫师2016

    2016-04-28

    1171浏览量

    python之数据库支持

    13.1.1 全局变量

    任何支持2.0版本DB API的数据库模块都必须定义3个描述模块特性的全局变量。这样做的原因时API设计的很灵活,以支持不同的基础机制、避免过多包装,可如果想让程序同时应用于几个数据库,那可是件麻烦事了,因为需要考虑到各种可能出现的状况。

    变量名用途

    apil...

    文章

    技术小胖子

    2017-11-09

    637浏览量

    sqlite3常用命令以及django如何操作sqlite3数据库

    一、如何进入sqlite3交互模式进行命令操作?

    1、确认sqlite3是否已经安装

    进去python命令行,执行

    1

    2

    >>> import sqlite3

    >>>

    没有报错,说明sqlite3已经成功安装了

    2、如何进入sql...

    文章

    余二五

    2017-11-16

    1157浏览量

    让Python更加充分的使用Sqlite3

    我最近在涉及大量数据处理的项目中频繁使用 sqlite3。我最初的尝试根本不涉及任何数据库,所有的数据都将保存在内存中,包括字典查找、迭代和条件等查询。这很好,但可以放入内存的只有那么多,并且将数据从磁盘重新生成或加载到内存是一个繁琐又耗时的过程。

    我决定试一试sqlite3。 因为只需打开与数...

    文章

    行者武松

    2017-10-31

    1877浏览量

    Android创建和使用数据库

    一、关系型数据库SQLIte

    每个应用程序都要使用数据,Android应用程序也不例外,Android使用开源的、与操作系统无关的SQL数据库—SQLite。SQLite第一个Alpha版本诞生于2000年5月,它是一款轻量级数据库,它的设计目标是嵌入式的,占用资源非常的低,只需要...

    文章

    sealin

    2015-12-11

    7536浏览量

    笨办法学 Python · 续 第六部分:SQL 和对象关系映射

    第六部分:SQL 和对象关系映射

    原文:Part VI: SQL and Object Relational Mapping

    译者:飞龙

    协议:CC BY-NC-SA 4.0

    自豪地采用谷歌翻译

    在本书的这一部分中,我们将介绍一些内容,它们与本书其余部分的...

    文章

    apachecn_飞龙

    2017-08-15

    781浏览量

    让Python更加充分的使用Sqlite3

    我最近在涉及大量数据处理的项目中频繁使用 sqlite3。我最初的尝试根本不涉及任何数据库,所有的数据都将保存在内存中,包括字典查找、迭代和条件等查询。这很好,但可以放入内存的只有那么多,并且将数据从磁盘重新生成或加载到内存是一个繁琐又耗时的过程。

    我决定试一试sqlite3。 因为只需打开与数据...

    文章

    反向一觉

    2017-11-01

    820浏览量

    NBA 史上实力最弱的球队是哪个?用 Python + SQL 我们找到了答案

    文中部分代码会有“代码补完”字样的注释,是留给读者自己补完并在线评测的,相当于小作业,这里就请大家自行脑补吧。(编者注:每个需要补充的部分都给出了提示信息)

    01. elo值

    elo值就像现在竞技网游里的天梯系统,队伍在每场比赛后会根据表现有所调整,胜增败减,小胜小增,大胜大增。elo值反映...

    文章

    玄学酱

    2017-08-02

    852浏览量

    一位数据科学家的私房工具清单

    作为一位万人敬仰的数据科学家,不但需要培育一棵参天技能树,私人武器库里没有一票玩得转的大火力工具也是没法在江湖中呼风唤雨的。

    近日北卡来罗纳大学CTO,一位数据科学家Jefferson Heard分享了多年来收集沉淀的数据分析工具集:

    处理较大、较复杂的类excel数据

    Pandas -处理t...

    文章

    知与谁同

    2017-08-01

    1244浏览量

    《Python Cookbook(第3版)中文版》——6.8 同关系型数据库进行交互

    本节书摘来自异步社区《Python Cookbook(第3版)中文版》一书中的第6章,第6.8节,作者[美]David Beazley , Brian K.Jones,陈舸 译,更多章节内容可以访问云栖社区“异步社区”公众号查看。

    6.8 同关系型数据库进行交互

    6.8.1 问题

    我们需要选择、插...

    文章

    异步社区

    2017-05-02

    1063浏览量

    2010年SQLite学习笔记之二

    2010年SQLite学习笔记之二

    一.建立数据库

    sqlite3.exe test.db

    二.双击sqlite-3_6_16目录下的程序sqlite3.exe,即可运行

    三.退出

    .exit

    或者

    .quit

    四.SQLite支持如下5种数据类型

    1.NULL:空值。2.INTEGER...

    文章

    littletigerbj

    2010-02-21

    739浏览量

    13 个 Python 新手练级项目

    云栖号:https://yqh.aliyun.com第一手的上云资讯,不同行业精选的上云企业案例库,基于众多成功案例萃取而成的最佳实践,助力您上云决策!

    学习 Python 的基础知识是一种美妙的体验。但对于中级 Python 开发人员来说,很多项目要么过难,要么过易。本文将列出十三个适合中级...

    文章

    云栖号资讯小编

    2020-03-01

    984浏览量

    《Python高性能编程》——1.3 为什么使用Python

    本节书摘来自异步社区《Python高性能编程》一书中的第1章,第1.3节,作者[美] 戈雷利克 (Micha Gorelick),胡世杰,徐旭彬 译,更多章节内容可以访问云栖社区“异步社区”公众号查看。

    1.3 为什么使用Python

    Python具有高度的表现力且容易上手——新开发者会很快发现他...

    文章

    异步社区

    2017-05-02

    2585浏览量

    展开全文
  • 创建BooksDB数据库

    2019-04-15 10:34:44
    利用 SQL 命令创建 BooksDB 数据库及表(ReaderType,Reader ,Book , Borrow ),并向表中插入测试数据
  • (3) 利用Transact-SQL语句创建数据库test,采用默认参数。若该数据库已存在,则删除后重建。 (4)修改数据库test,将数据文件的逻辑文件名修改为“测试数据”,操作系统文件名修改成D:\DATA\test.MDF。将事务日志...
  • 3. 利用图形用户界面创建、备份、删除和还原数据库和数据表(40分,每小题5分) 数据库和表的要求 数据库名:SPJ_MNG,其中包含四张表:S表, P表, J表, SPJ表 S (SNO, SNAME, STATUS, CITY) P (PNO, PNAME, COLOR,...

    一. 实验内容、步骤以及结果

    1. 利用图形用户界面连接数据库(10分)。

    2. 利用命令行连接数据库(10分)。

    3. 利用图形用户界面创建、备份、删除和还原数据库和数据表(40分,每小题5分)

    • 数据库和表的要求

      数据库名:SPJ_MNG,其中包含四张表:S表, P表, J表, SPJ表

      S (SNO, SNAME, STATUS, CITY)
      P (PNO, PNAME, COLOR, WEIGHT)
      J (JNO, JNAME, CITY)
      SPJ (SNO, PNO, JNO, QTY)

    供应商表S由供应商代码(SNO)、供应商姓名(SNAME)、供应商状态(STATUS)、供应商所在城市(CITY)组成。

    零件表P由零件代码(PNO)、零件名(PNAME)、颜色(COLOR)、重量(WEIGHT)组成。

    工程项目表J由工程项目代码(JNO)、工程项目名(JNAME)、工程项目所在城市(CITY)组成。

    供应情况表SPJ由供应商代码(SNO)、零件代码(PNO)、工程项目代码(JNO)、供应数量(QTY)组成,表示某供应商供应某种零件给某工程项目的数量为QTY

    • 现在该数据库有若干数据如下,基于该库表完成指定操作。

      表略

    (1) 创建SPJ_MNG数据库。

    (2) 在SPJ_MNG数据库中创建以上四张表(只输入一部分数据示意即可)。

    (3) 导出数据库SPJ_MNG为一个SQL文件。

    mysql workbench左上方有一个导航区,
    选择administration->data export。
    选中需要导出的数据库设置相关参数,进行导出。
    

    (4) 删除已经创建的供应情况表(SPJ表)。

    drop tables s,p,j,spj
    

    (5) 删除SPJ_MNG数据库。

    drop database spj_2018302390
    

    (6) 利用(3)中备份过的SQL文件还原刚才删除的SPJ_MNG数据库。

    MySQL WorkBench中选择Administration → Data Import/Restore。
    首先新建数据库SPJ_MNG,然后选中备份文件所在的文件夹,开始导入。
    

    (7) 修改S表,增加一个联系电话的字段STEL,数据类型为字符串类型,并修改S表中SNO允许的字符串最大长度。

    alter table s add stel char(15);
    alter table s alter column sno char(20);
    

    (8) 了解MySQL 的物理存储文件,查看本机MySQL服务安装目录下(如默认安装C:\ProgramData\MySQL\MySQL Server 8.0\Data)的数据文件。尝试分别按照InnoDB和MyISAM不同的存储引擎创建表,观察并说明物理存储文件差异。

    差异:

    InnoDB 支持事物,是事物安全的,提供行级锁和外键约束,有缓冲池,用于缓冲数据和索引。

    MyiSAM不支持事物,不支持外键约束,不支持行级锁,操作时需要锁定整张表,不过会保存表的行数,执行较快。

    4. 利用命令行创建、备份、删除和还原数据库和数据表(40分,每小题5分)

    • 数据库和表的要求
      数据库名:Student, 其中包含三个表:S,C,SC

      S (SNO, SNAME, SGENDER, SBIRTH, SDEPT, SAGE)
      C (CNO, CNAME, CPNO, CREDIT)
      SC (SNO, CNO, GRADE)

    学生信息表S由学生学号(SNO)、姓名(SNAME)、性别(SGENDER)、出生日期(SBIRTH)、所在学院(SDEPT)、年龄(SAGE)组成。

    课程信息表P由课程编号(CNO)、课程名(CNAME)、先修课编号(CPNO)、学分(CREDIT)组成。

    选课信息表SC由学生学号(SNO)、课程编号(CNO)、成绩(GRADE)组成。表示某个学生选修了某门课程,成绩为GRADE

    • 现在该数据库有若干数据如上所示,基于该库表完成指定操作。

      数据略

    (1) 用SQL语句创建数据库Student。

    Create database student
    

    (2) 用SQL语句创建上述的三张表,各个字段的数据类型请自己确定,每张表只要有主键约束即可,不要其他约束。不用输入数据。

    CREATE TABLE s (
    	Sno INT ,
      	Sname CHAR (20),
    	Sgender CHAR (5) ,	
       	Birth CHAR (20),
        Sdept CHAR (5),
      	PRIMARY KEY (Sno )
    );
    CREATE TABLE c (
    	Cno INT ,
      	Cname CHAR (20),
    	Cpno INT,
    	Credit INT,
      	PRIMARY KEY (Cno )
    );
    CREATE TABLE sc (
    	Sno INT ,
      	Cno INT ,
      	Grade INT,
        FOREIGN KEY (Sno) REFERENCES s(Sno),
        FOREIGN KEY (Cno) REFERENCES c(Cno)
    );
    

    (3) 备份数据库Student。

    命令行切换到C:\Program Files\MySQL\MySQL Server 8.0\bin目录下面
    (用mysqldump命令。)(回车后要求输入-u用户的密码):

    mysqldump -h localhost -u root -p student > d:\student.sql
    mysqldump -h localhost -u root -p --no-data --databases student > d:\s2.sql
    		h: 服务器名或IP;-u: 用户名;  -p:密码  student:待备份库
    		--no-data: 不备份数据
    	
    

    含义:将本机数据库student备份到d盘的sql文件中。

    (4) 用SQL语句删除创建的表。

    drop tables s, c,sc;
    

    (5) 用SQL语句删除创建的数据库。

    drop databases student;
    

    (6) 用SQL语句利用(3)中的备份文件还原student数据库。

    先使用SQL语句创建Student数据库,再利用(3)中备份的文件进行还原。
    打开cmd.exe运行程序,切换到MySQL的bin目录下面,使用以下命令进行还原:

    create database student;
    mysql -h localhost -uroot -p student<d:/student.sql
    

    (7) 修改S表,增加一个联系电话的字段STEL,数据类型为字符串类型,并修改S表中SNO允许的字符串最大长度。

    alter table s add stel char(15);
    alter table s alter column sno char(20); 
    

    (8) 查看mysqldump 生成的SQL文件中的定义数据库或表的SQL脚本,对比自动生成的脚本和自己写的SQL语句的异同点。

    MySQL dump生成的SQL文件中的SQL脚本解释性语言较多,并且会在每一个建表语句之前删除同名表等,sql语句编写较为完整,逻辑缜密。

    二. 实验中出现的问题以及解决方案(对于未解决问题请将问题列出来)

    问题:在使用命令行对字符串长度进行更改的时候,发现云数据库上的代码命令行中实现不了。

    解决方案: alter table s alter column sno varchar(20);
    变为:mysql8.0: alter table s modify sno varchar(20);
    随着版本的改变,mysql 语句也在做着改变

    展开全文
  • 数据库系统概念原书第六版-大学模式示例官方创建语句,取自db-book.com,官方提供了建表语句以及数据
  • GitHub项目地址: ... SQLite是一款轻量级的关系型数据库,它的运算速度非常快,...SQLite不仅支持标准的SQL语法,还遵循了数据库的ACID事务,所以只要你以前使用过其他的关系型数据库,就可以很快的上手SQLite。而SQ...

    GitHub项目地址:

    https://github.com/Skymqq/DatabaseSave.git

    SQLite是一款轻量级的关系型数据库,它的运算速度非常快,占用资源也很少,通常只需要几百KB的内存就足够了,因而特别适合在移动设备上使用。SQLite不仅支持标准的SQL语法,还遵循了数据库的ACID事务,所以只要你以前使用过其他的关系型数据库,就可以很快的上手SQLite。而SQLite又比一般的数据库要简单的多,它甚至不用设置用户名和密码就可以使用。Android正是把这个功能极为强大的数据库嵌入到了系统中,使用本地持久化的功能有了一次质的飞跃。

    文件存储和SharedPreferences存储毕竟只适用于保存一些简单的数据和键值对,当需要存储大量复杂的关系型数据的时候,你就会发现这两种存储方式很难应付。比如我们手机的短信程序中可能会有很多个会话,每个会话中又包含了很多条信息内容,并且大部分会话还可能各自对应了电话薄中的某个联系人。很难想象如何用文件或者SharedPreferences来存储这些数据量大、结构性复杂的数据吧?但是使用数据库就可以做得到。那么我们就赶快来看一看,Android中的SQLite数据库到底是如何使用的。

    创建数据库

    Android为了让我们能够更加方便地管理数据库,专门提供了一个SQLiteOpenHelper帮助类,借助这个类就可以非常简单地对数据库进行创建和升级。既然有好东西可以直接使用,那么我们当然要尝试一下了,下面我就对SQLiteOpenHelper的基本用法进行介绍。

    首先你要知道SQLiteOpenHelper是一个抽象类,这意味着如果我们想要使用它的话,就需要创建一个自己的帮助类去继承它。SQLiteOpenHelper中有两个抽象方法,分别是onCreate()和onUpgrade(),我们必须在自己的帮助类里面重写这两个方法,然后分别在这两个方法中去实现创建、升级数据库的逻辑。

    SQLiteOpenHelper中还有两个非常重要的实例方法:getReadableDatabase()和getWritableDatabase()。这两个方法都可以创建或打开一个现有的数据库(如果数据库已存在则直接打开,否则创建一个新的数据库),并返回一个可对数据库进行读写操作的对象。不同的是,当数据库不可写入的时候(如磁盘空间已满),getReadableDatabase()方法返回的对象将以只读的方式去打开数据库,而getWritableDatabase()方法则将出现异常。

    SQLiteOpenHelper中有两个构造方法可供重写,一般使用参数少一点的那个构造方法即可。这个构造方法中接收4个参数:

    第一个参数是Context,这个没什么好说的,必须要有它才能对数据库进行操作。

    第二个参数是数据库名,创建数据库时使用的就是这里指定的名称。

    第三个参数允许我们在查询数据的时候返回一个自定义的Cursor,一般都是传入null。

    第四个参数表示当前数据库的版本号,可用于对数据库进行升级操作。

    构建出SQLiteOpenHelper的实例之后,再调用它的getReadableDatabase()或getWritableDatabase()方法就能够创建数据库了,数据库文件会存放在/data/data/<package name>/databases/目录下。此时,重写的onCreate()方法也会得到执行,所以通常会在这里去处理一些创建表的逻辑。

    接下来我们通过新建一个DatabaseSave项目来具体的了解SQLiteOpenHelper的使用吧。

    这里我们希望创建一个名为BookStore.db的数据库,然后在这个数据库中新建一张Book表,表中有id(主键)、作者、价格、页数和书名等列。创建数据库表当然还是需要用建表语句的,这里也是要考验一下你的SQL基本功了,Book表的创建语句如下所示:

    public static final String CREATE_BOOK = "create table Book(" +
                "id integer primary key autoincrement," +
                "author text," +
                "price real," +
                "pages integer," +
                "name text)";

    integer:整型

    text:文本类型

    real:浮点型

    blob:二进制类型

    primary key:主键

    autoincrement:自增

     

    SQLiteOpenHelper.java代码:

    package com.example.administrator.databasesave;
    
    import android.content.Context;
    import android.database.sqlite.SQLiteDatabase;
    import android.database.sqlite.SQLiteOpenHelper;
    import android.widget.Toast;
    
    public class MyDatabaseHelper extends SQLiteOpenHelper {
        private Context context;
    
        public static final String CREATE_BOOK = "create table Book(" +
                "id integer primary key autoincrement," +
                "author text," +
                "price real," +
                "pages integer," +
                "name text)";
    
        public MyDatabaseHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
            super(context, name, factory, version);
            this.context = context;
        }
    
    
        @Override
        public void onCreate(SQLiteDatabase db) {
            db.execSQL(CREATE_BOOK);
            Toast.makeText(context, "create table successfully", Toast.LENGTH_SHORT).show();
        }
    
        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        }
    }
    

    可以看到,我们把建表语句定义成了一个字符常量,然后在onCreate()方法中又调用了SQLiteDatabase的execSQL()方法去执行这条建表语句,并弹出一条Toast提示表示创建成功,这样就可以保证在数据库创建完成的同时还能成功创建Book表。

    activity_main.xml代码:

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">
    
        <Button
            android:id="@+id/btn_create"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="Create Database"
            android:textAllCaps="false"
            android:textSize="18sp"
            android:textStyle="bold" />
    </LinearLayout>

    MainActivity.java代码:

    package com.example.administrator.databasesave;
    
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    import android.view.View;
    import android.widget.Button;
    
    public class MainActivity extends AppCompatActivity implements View.OnClickListener {
        private Button btn_create;
        private MyDatabaseHelper helper;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            initData();
            initView();//初始化UI控件
        }
    
        private void initData() {
            helper=new MyDatabaseHelper(MainActivity.this,"BookStore.db",null,1);
        }
    
        private void initView() {
            btn_create=(Button)findViewById(R.id.btn_create);
            btn_create.setOnClickListener(this);
        }
    
        @Override
        public void onClick(View v) {
            switch (v.getId()){
                case R.id.btn_create:
                    helper.getWritableDatabase();//以可写的方式,创建或打开数据库
                    break;
            }
        }
    }
    

    效果图:

    点击Create Database按钮之后弹出Toast提示,说明此时BookStore.db数据库和Book表应该已经创建成功了,因为当你再次点击Create Database按钮时,不会再有Toast弹出。可是我们怎么才能证明它们确实是被创建成功了呢?如果还是使用Device File Explorer到data/data/com.example.administrator.databasesave/databases/路径下看,如下所示:

    生成了3个文件

    1.BookStore.db:生成的BookStore数据库文件

    2.BookStore.db-shm :共享内存

    3.BookStore.db-wal:write-ahead log,是保存的一个日志文件

    此时我们通过数据库管理工具打开BookStore.db是看不到任何东西的,连表都看不到,我试了下。

    所以这里我在这里介绍另外一种查看方式,通过adb shell来对数据库和表的创建情况进行检查。

     

    adb是AndroidSDK中自带的一个调试工具,使用这个工具可以直接对连接在电脑上的手机或模拟器进行调试操作。它存放在sdk的platform-tools目录下,如果想要在命令行中使用这个工具,就需要先把它的路径配置到环境变量里。这里我就暂不演示了,网上教程挺多也挺详细的。

    配置好了环境变量之后,就可以使用adb工具了,打开命令行界面。

    步骤1:Windows+R  输入 cmd 进入DOS命令行界面。

    步骤2:输入 adb shell  回车

    步骤3:进入自己的项目路径,如下图所示:

    cd  /data/data/com.example.administrtor.databasesave/databases/是我的项目路径

    如果你也出现Permission denied,那么你需要输入一下su root命令来获取root权限,然后就可以再操作一次了,如下所示:

    步骤3:输入cd  /data/data/com.example.administrtor.databasesave/databases/

    步骤4:输入ls   回车之后我们会看到   BookStore.db  BookStore.db-shm  BookStore.db-wal  这3个文件就像我们在Device File Explorer中看到的一样。

    步骤5:输入sqlite3 BookStore.db

    步骤6:输入 .table(注意前面有个点)

    可以看到,此时数据库中有两张表,android_metadata表示每个数据库中都会自动生成的,不用管它,而另外一张Book表就是我们刚刚点击Create Database按钮之后,通过MyDatabaseHelper所创建的。

    步骤7:输入.schema(注意前面有个点)

    通过.shcema命令,我们可以看到创建表的sql语句,其中第二行的sql语句就是我们创建Book表的语句。


    升级数据库:

    使用重写的onUpgrade()方法来对数据库进行升级,它在整个数据库的管理工作当中起着非常重要的作用。

    目前DatabaseSave项目中已经有一张Book表用于存放书的各种详细数据,如果我们想再添加一张Category表用于记录图书的分类,该怎么做呢?

    比如Category表中有id(主键)、分类名和分类代码这几个列,那么建表语句如下:

      public static final String CREATE_CATEGORY = "create table Category(" +
                "id integer primary key autoincrement," +
                "category_name text," +
                "category_code integer)";
    

    MyDatabaseHelper.java代码:

    package com.example.administrator.databasesave;
    
    import android.content.Context;
    import android.database.sqlite.SQLiteDatabase;
    import android.database.sqlite.SQLiteOpenHelper;
    import android.widget.Toast;
    
    public class MyDatabaseHelper extends SQLiteOpenHelper {
        private Context context;
    
        public static final String CREATE_BOOK = "create table Book(" +
                "id integer primary key autoincrement," +
                "author text," +
                "price real," +
                "pages integer," +
                "name text)";
    
        public static final String CREATE_CATEGORY = "create table Category(" +
                "id integer primary key autoincrement," +
                "category_name text," +
                "category_code integer)";
    
        public MyDatabaseHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
            super(context, name, factory, version);
            this.context = context;
        }
    
    
        @Override
        public void onCreate(SQLiteDatabase db) {
            db.execSQL(CREATE_BOOK);//执行sql语句创建Book表
            db.execSQL(CREATE_CATEGORY);//执行sql语句创建Category表
            Toast.makeText(context, "create table successfully", Toast.LENGTH_SHORT).show();
        }
    
        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
            db.execSQL("drop table if exists Book");
            db.execSQL("drop table if exists Category");
            onCreate(db);
        }
    }
    

    MainActivity.java代码:

    package com.example.administrator.databasesave;
    
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    import android.view.View;
    import android.widget.Button;
    
    public class MainActivity extends AppCompatActivity implements View.OnClickListener {
        private Button btn_create;
        private MyDatabaseHelper helper;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            initData();
            initView();//初始化UI控件
        }
    
        private void initData() {
            helper=new MyDatabaseHelper(MainActivity.this,"BookStore.db",null,2);
        }
    
        private void initView() {
            btn_create=(Button)findViewById(R.id.btn_create);
            btn_create.setOnClickListener(this);
        }
    
        @Override
        public void onClick(View v) {
            switch (v.getId()){
                case R.id.btn_create:
                    helper.getWritableDatabase();//以可写的方式,创建或打开数据库
                    break;
            }
        }
    }
    

    注意:这里在MainActivity.java中只将数据库的版本号改为2就行了。

    运行效果:

     

    为了验证一下Category表是不是已经创建成功了,我们在adb shell中打开BookStore.db数据库,然后键入.table命令和.schema命令,如下所示:

     

    步骤1:adb shell

    步骤2:cd  项目路径

    步骤3:su root(如果出现Permission denied再输入su root命令)

    步骤4:cd 项目路径

    步骤5:sqlite3 BookStore.db

    步骤6:.table

    步骤7:.schema


    C(Create)添加数据:

    现在你已经掌握了创建和升级数据库的方法,接下来就该学习一下如何对表中的数据进行操作了。其实我们可以对数据进行的操作无非4中,即CRUD。

    CRUD:

    C(Create)添加

    R(Retrieve)查询

    U(Update)更新

    D(Delete)删除

    每一种操作又各自对应了一种SQL命令,如果你比较熟悉SQL语言的话,一定会知道

    添加数据时使用insert

    查询数据时使用select

    更新数据时使用update

    删除数据时使用delete

    但是开发者的水平总是参差不齐的,未必每一个人都能非常熟悉地使用SQL语言,因此Android也提供了一系列的辅助性方法,使得Android中即使不去编写SQL语句,也能轻松完成所有的CRUD操作。

    前面我已经知道,调用SQLiteOpenHelper的getReadableDatabase()和getWritableDatabase()方法是可以用于创建和升级数据库的,不仅如此,这两个方法还都会返回一个SQLiteDatabase对象,借助这个对象就可以对数据进行CRUD操作了。

    那么下面我们首先学习一下如何向数据库的表中添加数据吧。SQLiteDatabase中提供了一个insert()方法,这个方法就是专门用于添加数据的。它接收3个参数,第一个参数是表名,我们希望向哪张表里添加数据,这里就传入该表的名字。第二个参数用于在未指定添加数据的情况下给某些为空的列自动赋值NULL,一般我们用不到这个功能,直接传入null即可。第三个参数是一个ContentValues对象,它提供了一系列的put()方法重载,用于向ContentValues中添加数据,只需要将表中的每个列名以及相应的待添加数据传入即可。

    activity_main.xml代码:

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">
    
        <Button
            android:id="@+id/btn_create"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="Create Database"
            android:textAllCaps="false"
            android:textSize="18sp"
            android:textStyle="bold" />
    
        <Button
            android:id="@+id/btn_add"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="Add Data"
            android:textAllCaps="false"
            android:textSize="18sp"
            android:textStyle="bold" />
    </LinearLayout>

    MainActivity.java代码:

    package com.example.administrator.databasesave;
    
    import android.content.ContentValues;
    import android.database.sqlite.SQLiteDatabase;
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    import android.view.View;
    import android.widget.Button;
    import android.widget.Toast;
    
    public class MainActivity extends AppCompatActivity implements View.OnClickListener {
        private Button btn_create, btn_add;
        private MyDatabaseHelper helper;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            initData();
            initView();//初始化UI控件
        }
    
        private void initData() {
            helper = new MyDatabaseHelper(MainActivity.this, "BookStore.db", null, 2);
        }
    
        private void initView() {
            btn_create = (Button) findViewById(R.id.btn_create);
            btn_add = (Button) findViewById(R.id.btn_add);
    
            btn_create.setOnClickListener(this);
            btn_add.setOnClickListener(this);
        }
    
        @Override
        public void onClick(View v) {
            switch (v.getId()) {
                case R.id.btn_create:
                    helper.getWritableDatabase();//以可写的方式,创建或打开数据库
                    break;
                case R.id.btn_add:
                    addData();//添加数据
                    Toast.makeText(this, "Add Data successfully", Toast.LENGTH_SHORT).show();
                    break;
            }
        }
    
        private void addData() {
            SQLiteDatabase db = helper.getWritableDatabase();
            ContentValues cv = new ContentValues();
            //开始组装第一条数据
            cv.put("name", "The Da Vinci Code");
            cv.put("author", "Dan Brown");
            cv.put("pages", 454);
            cv.put("price", 16.96);
            db.insert("Book", null, cv);
            cv.clear();
    
            //开始组装第二条数据
            cv.put("name", "The Lost Symbol");
            cv.put("author", "Dan Brown");
            cv.put("pages", 510);
            cv.put("price", 19.95);
            db.insert("Book", null, cv);
        }
    }
    

    点击Add Data按钮之后,Toast提示数据已经添加成功,效果图:

    为了证实数据已经成功添加,我们还是继续使用adb shell来看一下BookStore.db数据库中的Book表中的数据:

    由此可见,我们向ContentValues容器中添加的两组数据都成功地添加到了Book表中。


    U(Update)更新数据

    学习完了如何向表中添加数据,接下来我们看看怎样才能修改表中已有的数据。SQLiteDatabase中提供了一个非常好用的updata()方法,用于对数据进行更新,这个方法接收4个参数,第一个参数和insert()方法一样,也是表名,在这里指定更新哪一张表 里的数据。第二个参数是ContentValues对象,要把更新数据在这里组装进去。第三、第四个参数用于约束更新某一行或某几行中的数据,不指定的话默认就是更新所有行。

    activity_main.xml代码:

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">
    
        <Button
            android:id="@+id/btn_create"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="Create Database"
            android:textAllCaps="false"
            android:textSize="18sp"
            android:textStyle="bold" />
    
        <Button
            android:id="@+id/btn_add"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="Add Data"
            android:textAllCaps="false"
            android:textSize="18sp"
            android:textStyle="bold" />
    
        <Button
            android:id="@+id/btn_update"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="Update Data"
            android:textAllCaps="false"
            android:textSize="18sp"
            android:textStyle="bold" />
    </LinearLayout>

    MainActivity.java代码:

    package com.example.administrator.databasesave;
    
    import android.content.ContentValues;
    import android.database.sqlite.SQLiteDatabase;
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    import android.view.View;
    import android.widget.Button;
    import android.widget.Toast;
    
    public class MainActivity extends AppCompatActivity implements View.OnClickListener {
        private Button btn_create, btn_add, btn_update;
        private MyDatabaseHelper helper;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            initData();
            initView();//初始化UI控件
        }
    
        private void initData() {
            helper = new MyDatabaseHelper(MainActivity.this, "BookStore.db", null, 2);
        }
    
        private void initView() {
            btn_create = (Button) findViewById(R.id.btn_create);
            btn_add = (Button) findViewById(R.id.btn_add);
            btn_update = (Button) findViewById(R.id.btn_update);
    
            btn_create.setOnClickListener(this);
            btn_add.setOnClickListener(this);
            btn_update.setOnClickListener(this);
        }
    
        @Override
        public void onClick(View v) {
            switch (v.getId()) {
                case R.id.btn_create:
                    helper.getWritableDatabase();//以可写的方式,创建或打开数据库
                    break;
                case R.id.btn_add:
                    addData();//添加数据
                    Toast.makeText(this, "Add Data successfully", Toast.LENGTH_SHORT).show();
                    break;
                case R.id.btn_update:
                    updateData();//更新数据
                    Toast.makeText(this, "Update Data successfully", Toast.LENGTH_SHORT).show();
                    break;
            }
        }
    
    
        private void addData() {
            SQLiteDatabase db = helper.getWritableDatabase();
            ContentValues cv = new ContentValues();
            //开始组装第一条数据
            cv.put("name", "The Da Vinci Code");
            cv.put("author", "Dan Brown");
            cv.put("pages", 454);
            cv.put("price", 16.96);
            db.insert("Book", null, cv);
            cv.clear();
    
            //开始组装第二条数据
            cv.put("name", "The Lost Symbol");
            cv.put("author", "Dan Brown");
            cv.put("pages", 510);
            cv.put("price", 19.95);
            db.insert("Book", null, cv);
        }
    
        private void updateData() {
            SQLiteDatabase db = helper.getWritableDatabase();
            ContentValues cv = new ContentValues();
            cv.put("price", 10.99);
            db.update("Book", cv, "name=?", new String[]{"The Da Vinci Code"});
        }
    }
    

    点击Update Data按钮之后,Toast提示数据已经更新成功,如下所示:

    为了证实数据已经成功更新,我们还是继续使用adb shell来看一下BookStore.db数据库中的Book表中的数据:

    之前的数据:

    更新之后的数据:

    可以看到,我们将名字为The Da Vinci Code的这本书的价格从16.96改成10.99。


    D(Delete)删除数据

    前面我们学习了一下添加数据和更新数据,代码不多,理解起来也很容易,删除数据也很简单,SQLiteDatabase中提供了一个delete()方法,专门用于删除数据,这个方法接收了3个参数,第一个参数仍然是表名,用于删除那张表中的数据,第二、第三个参数又是用于约束删除某一行或某几行的数据,不指定的话默认就是删除所有行。

    activity_main.xml代码:

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">
    
        <Button
            android:id="@+id/btn_create"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="Create Database"
            android:textAllCaps="false"
            android:textSize="18sp"
            android:textStyle="bold" />
    
        <Button
            android:id="@+id/btn_add"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="Add Data"
            android:textAllCaps="false"
            android:textSize="18sp"
            android:textStyle="bold" />
    
        <Button
            android:id="@+id/btn_update"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="Update Data"
            android:textAllCaps="false"
            android:textSize="18sp"
            android:textStyle="bold" />
    
        <Button
            android:id="@+id/btn_delete"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="Delete Data"
            android:textAllCaps="false"
            android:textSize="18sp"
            android:textStyle="bold" />
    </LinearLayout>

    MainActivity.java代码:

    package com.example.administrator.databasesave;
    
    import android.content.ContentValues;
    import android.database.sqlite.SQLiteDatabase;
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    import android.view.View;
    import android.widget.Button;
    import android.widget.Toast;
    
    public class MainActivity extends AppCompatActivity implements View.OnClickListener {
        private Button btn_create, btn_add, btn_update, btn_delete;
        private MyDatabaseHelper helper;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            initData();
            initView();//初始化UI控件
        }
    
        private void initData() {
            helper = new MyDatabaseHelper(MainActivity.this, "BookStore.db", null, 2);
        }
    
        private void initView() {
            btn_create = (Button) findViewById(R.id.btn_create);
            btn_add = (Button) findViewById(R.id.btn_add);
            btn_update = (Button) findViewById(R.id.btn_update);
            btn_delete = (Button) findViewById(R.id.btn_delete);
    
            btn_create.setOnClickListener(this);
            btn_add.setOnClickListener(this);
            btn_update.setOnClickListener(this);
            btn_delete.setOnClickListener(this);
        }
    
        @Override
        public void onClick(View v) {
            switch (v.getId()) {
                case R.id.btn_create:
                    helper.getWritableDatabase();//以可写的方式,创建或打开数据库
                    break;
                case R.id.btn_add:
                    addData();//添加数据
                    Toast.makeText(this, "Add Data successfully", Toast.LENGTH_SHORT).show();
                    break;
                case R.id.btn_update:
                    updateData();//更新数据
                    Toast.makeText(this, "Update Data successfully", Toast.LENGTH_SHORT).show();
                    break;
                case R.id.btn_delete:
                    deleteData();//删除数据
                    Toast.makeText(this, "Delete Data successfully", Toast.LENGTH_SHORT).show();
                    break;
            }
        }
    
    
        private void addData() {
            SQLiteDatabase db = helper.getWritableDatabase();
            ContentValues cv = new ContentValues();
            //开始组装第一条数据
            cv.put("name", "The Da Vinci Code");
            cv.put("author", "Dan Brown");
            cv.put("pages", 454);
            cv.put("price", 16.96);
            db.insert("Book", null, cv);
            cv.clear();
    
            //开始组装第二条数据
            cv.put("name", "The Lost Symbol");
            cv.put("author", "Dan Brown");
            cv.put("pages", 510);
            cv.put("price", 19.95);
            db.insert("Book", null, cv);
        }
    
        private void updateData() {
            SQLiteDatabase db = helper.getWritableDatabase();
            ContentValues cv = new ContentValues();
            cv.put("price", 10.99);
            db.update("Book", cv, "name=?", new String[]{"The Da Vinci Code"});
        }
    
        private void deleteData() {
            SQLiteDatabase db = helper.getWritableDatabase();
            db.delete("Book", "pages>?", new String[]{"500"});//删除Book表中pages>500的这一行数据。
        }
    
    }
    

    点击Delete Data按钮之后,Toast提示数据已经删除成功,如下所示:

    为了证实数据已经成功删除,我们还是继续使用adb shell来看一下BookStore.db数据库中的Book表中的数据:

    之前的数据:

    删除之后的数据:

    前后对比之后,我们发现Book表中pages>500的哪一行数据被成功地删除了。


    R(Retrieve)查询数据

    终于到了最后一种操作了,掌握了查询数据方法之后,你就将数据库的CRUD操作全部学完了。不过千万不要因此而放松,因为查询数据是CRUD中最复杂的一种操作。

    我们都知道SQL的全称是Structured Query Language,翻译成中文就是结构化查询语言。它的大部分功能都体现在“查”这个字上的,而“增删改”只是其中的一小部分功能。由于SQL查询涉及的内容实在是太多了,因此在这里我不准备对它展开来讲解,而是只会介绍Android上的查询功能。如果你对SQL语言非常感兴趣,可以专门找一本SQL的书进行学习。

    相信你已经猜到了,SQLIteDatabase中还提供了一个query()方法用于对数据进行查询。这个方法的参数非常复杂,最短的一个方法重载也需要传入7个参数。那么我们就先来看一下这7个参数的各自含义吧:

    1.第一个参数:表名(表示我们希望从哪张表中查询数据)

    2.第二个参数:用于指定去查询哪几列,如果不指定则默认查询所有列

    3.第三个参数和第四个参数:用于约束查询某一行或某几行的数据,不指定则默认查询所有行的数据

    4.第五个参数:用于指定需要取group by的列,不指定则表示不对查询结果进行group by操作。

    5.第六个参数:用于对group by之后的数据进行进一步的过滤,不指定则表示不进行过滤

    6.第七个参数:用于指定查询结果的排序方式,不指定则表示使用默认的排序方式。

     

    虽然query()方法的参数非常多,但是不要对它产生畏惧,因为我们不必为每条查询语句都指定所有的参数,多数情况下只需要传入少数几个参数就可以完成查询操作了。调用query()方法后会返回一Cursor对象,查询到的所有数据都将从这个对象中取出。

    activity_main.xml代码:

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">
    
        <Button
            android:id="@+id/btn_create"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="Create Database"
            android:textAllCaps="false"
            android:textSize="18sp"
            android:textStyle="bold" />
    
        <Button
            android:id="@+id/btn_add"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="Add Data"
            android:textAllCaps="false"
            android:textSize="18sp"
            android:textStyle="bold" />
    
        <Button
            android:id="@+id/btn_update"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="Update Data"
            android:textAllCaps="false"
            android:textSize="18sp"
            android:textStyle="bold" />
    
        <Button
            android:id="@+id/btn_delete"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="Delete Data"
            android:textAllCaps="false"
            android:textSize="18sp"
            android:textStyle="bold" />
    
        <Button
            android:id="@+id/btn_query"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="Query Data"
            android:textAllCaps="false"
            android:textSize="18sp"
            android:textStyle="bold" />
    </LinearLayout>

    MainActivity.java代码:

    package com.example.administrator.databasesave;
    
    import android.content.ContentValues;
    import android.database.Cursor;
    import android.database.sqlite.SQLiteDatabase;
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    import android.util.Log;
    import android.view.View;
    import android.widget.Button;
    import android.widget.Toast;
    
    public class MainActivity extends AppCompatActivity implements View.OnClickListener {
        private Button btn_create, btn_add, btn_update, btn_delete, btn_query;
        private MyDatabaseHelper helper;
        public static final String TAG = "MainActivity";
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            initData();
            initView();//初始化UI控件
        }
    
        private void initData() {
            helper = new MyDatabaseHelper(MainActivity.this, "BookStore.db", null, 2);
        }
    
        private void initView() {
            btn_create = (Button) findViewById(R.id.btn_create);
            btn_add = (Button) findViewById(R.id.btn_add);
            btn_update = (Button) findViewById(R.id.btn_update);
            btn_delete = (Button) findViewById(R.id.btn_delete);
            btn_query = (Button) findViewById(R.id.btn_query);
    
            btn_create.setOnClickListener(this);
            btn_add.setOnClickListener(this);
            btn_update.setOnClickListener(this);
            btn_delete.setOnClickListener(this);
            btn_query.setOnClickListener(this);
        }
    
        @Override
        public void onClick(View v) {
            switch (v.getId()) {
                case R.id.btn_create:
                    helper.getWritableDatabase();//以可写的方式,创建或打开数据库
                    break;
                case R.id.btn_add:
                    addData();//添加数据
                    Toast.makeText(this, "Add Data successfully", Toast.LENGTH_SHORT).show();
                    break;
                case R.id.btn_update:
                    updateData();//更新数据
                    Toast.makeText(this, "Update Data successfully", Toast.LENGTH_SHORT).show();
                    break;
                case R.id.btn_delete:
                    deleteData();//删除数据
                    Toast.makeText(this, "Delete Data successfully", Toast.LENGTH_SHORT).show();
                    break;
                case R.id.btn_query:
                    queryData();//查询数据
                    Toast.makeText(this, "Query Data successfully", Toast.LENGTH_SHORT).show();
                    break;
            }
        }
    
    
        private void addData() {
            SQLiteDatabase db = helper.getWritableDatabase();
            ContentValues cv = new ContentValues();
            //开始组装第一条数据
            cv.put("name", "The Da Vinci Code");
            cv.put("author", "Dan Brown");
            cv.put("pages", 454);
            cv.put("price", 16.96);
            db.insert("Book", null, cv);
            cv.clear();
    
            //开始组装第二条数据
            cv.put("name", "The Lost Symbol");
            cv.put("author", "Dan Brown");
            cv.put("pages", 510);
            cv.put("price", 19.95);
            db.insert("Book", null, cv);
        }
    
        private void updateData() {
            SQLiteDatabase db = helper.getWritableDatabase();
            ContentValues cv = new ContentValues();
            cv.put("price", 10.99);
            db.update("Book", cv, "name=?", new String[]{"The Da Vinci Code"});
        }
    
        private void deleteData() {
            SQLiteDatabase db = helper.getWritableDatabase();
            db.delete("Book", "pages>?", new String[]{"500"});//删除Book表中pages>500的这一行数据。
        }
    
        private void queryData() {
            SQLiteDatabase db = helper.getWritableDatabase();
            //查询Book表中的所有数据
            Cursor cursor = db.query("Book", null, null, null, null, null, null);
            if (cursor.moveToFirst()) {
                do {
                    //遍历Cursor对象,取出数据并打印
                    String name = cursor.getString(cursor.getColumnIndex("name"));
                    String author = cursor.getString(cursor.getColumnIndex("author"));
                    int pages = cursor.getInt(cursor.getColumnIndex("pages"));
                    double price = cursor.getDouble(cursor.getColumnIndex("price"));
                    Log.e(TAG, "name: " + name);
                    Log.e(TAG, "author: " + author);
                    Log.e(TAG, "pages: " + pages);
                    Log.e(TAG, "price: " + price);
                } while (cursor.moveToNext());
            }
            cursor.close();
        }
    
    }
    

    可以看到,我们首先在查询按钮的点击事件里面用一个queryData()方法将查询的一系列操作给封装了,在这个方法中我们通过调用SQLiteDatabase中的query()方法,然后只填了第一个参数,指定要查询的数据库表,也就是Book表。其余的6个参数,我们都指定为null了,这就表示希望查询这张Book表中的所有数据,虽然这张表中目前只剩下一条数据了。查询完之后就得到了一个Cursor对象,接着我们调用它的moveToFirst()方法将数据的指针移动到第一行的位置,然后进入了一个循环当中,去遍历查询到的每一行数据。在这个循环中可以通过Cursor的getColumnIndex()方法获取到某一列在表中对应的位置索引,然后将这个索引传入到相应的取值方法中,就可以得到从数据库中读取到的数据了。

    点击QueryData按钮,Toast提示查询数据成功,效果图如下所示:

    日志打印Book表中所查询出来的数据:

    adb shell查询BookStore.db数据库、Book表中的数据:

     

     

    展开全文
  • E-R模型【实体关系】entity实体relationship关系 mysql对大小写不敏感 查看数据库引擎 SHOW VARIABLES LIKE ‘%storage_engine%’; 创建数据表术语 英文 中文 数据库 database ...创建数据库【m
  • 手动创建数据库通常包含如下操作步骤:(参照E:\资料\oracle资料及培训资料\手动创建oracle数据库\详解Oracle手动创建数据库几大步骤.txt)1、确定新建数据库名称和实例名称;2、确定数据库管理员的认证方式;3、创建...
  • MySQL数据库的基本操作 创建数据库、查看数据库、删除数据库等操作 连接到 MySQL 数据库后,就可以使用数据定义语言(DDL)来定义和管理数据库对象,包括数据库、表、索引以视图等。这里使用一个简单的例子,介绍...
  • 数据库视图的创建与使用ppt,需要的童鞋课下载
  • JDBC操作数据库

    2014-06-24 10:54:19
    使用INSERT语句通过JDBC在数据库中添加数据
  • Oracle12c 中,增加了可插接数据库的概念,即PDB,允许一个...下面这篇文章主要给大家介绍了利用oracle 12c创建可插拔数据库(PDB)与用户的相关资料,文中介绍的很详细,需要的朋友可以参考借鉴,下面来一起看看吧。
  • 数据库数据库和表的创建

    千次阅读 2020-05-26 18:55:50
    数据库和表的创建 本文使用SQLserver数据库为师范 1 目的 1、掌握利用 SSMS 及 SQL 命令两种方式管理数据库; 2、掌握利用 SSMS 及 ...1、创建数据库、修改数据库、删除数据库、数据库的分离与附加; 2、创建表、修改
  • 数据库表的创建、管理和数据操作(实验一),数据库创建今天我们就以实验的形式对表的创建、管理和数据操作进行学习,上课吧。【实验目的】:了解SQL语言的使用,进一步理解关系运算,巩固数据库的基础知识。【实验...
  • ump目录,bdump目录存放的是数据库动行过程中的各个后台进程的跟踪信息,当中alert文件是警告文件,其文件名称为 alert_book.log,当数据库出现问题时,首先就可以去查看此文件以找出原因,手工创建过程中出现的各种...
  • 1、指定连接pymysql(python3.x)先配置_init_.pyimport pymysqlpymysql.install_as_MySQLdb()2、配置连接mysql文件信息settings.pyDATABASES = {'default': {'ENGINE': 'django.db.backends.mysql','NAME': 'django_...
  • android创建数据库

    2020-01-12 15:10:35
    看了很多关于android使用sqlite数据库的文章,很多都是介绍了数据库的建立和表的建立,而表通常都是只建立一张,而实际情况我们用到的表可能不止一张,那这种情况下我们又该怎么办呢,好了,下面我教大家如何在...
  • 创建数据库、表和索引 一、创建数据库 二、创建与删除模式 三、创建与修改表 (1)创建表 (2)修改表 三、创建与删除索引 (1)创建索引 (2)删除索引
  • ① 在“图书读者数据库”(Book_Reader_DB)中,先用视图创建向导的方法创建视图View1和View2。其中View1包括书号、书名、定价、数量等属性。View2包括读者号、读者姓名、单位、电话、书号、书名、借阅日期、应归还...
  • 第3章 第一个Android程序第3章 MySQL数据库管理一、选择题1.下列( )不能作用MySQL数据库名。A.minrisoft B.mingrisoft_01 C...A.在Windows系统中,可以创建一个名称为tb_bookInfo的数据库和一个名称为tb_bookinf...
  • 数据库创建 数据库创建分为两大部分:主文件与日志文件; 在初始化的时候主文件与日志文件需要声明的内容几乎相同,大致都是下列5个; name = 'xxxx', --逻辑文件名字,“逻辑名”,不是文件名 ...
  • 在 android 中有个类可方便的直接创建数据库,自己写一个类继承 SQLiteOpenHelperpackage com.wangban.yzbbanban.test_mysqlite; import android.content.Context; import android.database.sqlite.SQLiteDatabase;...
  • 某公司因业务范围日益扩大,最近订购了一套基于B/S架构的电子商务系统,在正式部署之前,要求对现有的httpd服务器进行改造,首先需要增加MySQL数据库服务。 需求描述: 编译安装MySQL服务器,并添加为mysqld系统服务...
  • ASP.Net Core中EntityFrameworkCore根据实体类自动创建数据库EntityFrameworkCore根据实体类自动创建数据库新建项目今天的学习就到这里吧~ EntityFrameworkCore根据实体类自动创建数据库 在平时,我们创建数据库都是...
  • 数据库课件

    2013-06-15 15:40:40
    2、为“图书读者数据库”(Book_Reader_DB)设置一个备份计划,要求每当一天工作结束时进行一次数据库的备份工作; 3、在企业管理器中恢复图书读者数据库; 4、修改图书读者数据库的备份计划,要求每星期对数据库...
  • 数据库 一个mongodb中可以建立多个数据库。 MongoDB的默认数据库为"db",该数据库存储在data目录中。 MongoDB的单个实例可以容纳多个独立的数据库,每一个都有自己的集合和权限,不同的数据库也放置在...
  • 数据库的名字为students,包含的数据文件的逻辑文件名为 students_dat,物理文件名为 students.mdf,存放在D:\Test文件夹中(若D:中无此子文件夹,可先建立此文件夹,然后再创建数据库),初始大小为6MB,自动增长...
  • id_book v1.0.0 使用模拟键盘的RFID扫描仪管理简单ID数据库的简单程序。 依存关系 此python3程序使用PyQt5和sqlite3... 要备份数据库,只需备份资产/address_book.db,这就是保护数据库所需的全部。 $ convert input

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 25,462
精华内容 10,184
关键字:

创建数据库db_book