数据库
首页 > 数据库> > 安卓学习日志 Day15 — 数据库基础

安卓学习日志 Day15 — 数据库基础

作者:互联网

文章目录

概述

目前为止,已经构建了各个不同的应用,也可能正急于构建自己的应用,但或许没有具体的想法。一个很好的练习方法是询问下当地的小商店或非盈利机构,看看他们是否需要帮助构建一个 Android 应用。

周围有很多的小商店都需要向用户提供信息,例如餐厅里的菜单、干洗店和裁缝店需要列出可以提供的服务。

还有更多类似的例子,需要将这些数据存储到某个地方,例如应用中 以便随时随地地访问这些数据。用户可以使用这一应用,店内人员也可以使用这一应用来管理日常事物或跟踪库存情况。

之后将研究一个示例,为一个收容所的工作人员开发一款移动应用,帮助他们记录各种不同的宠物。学习一个构建数据的强大方式,构建一款应用来利用这一结构,从而允许用户(店内工作人员)轻松获取每个宠物的信息,并能够对这些信息执行操作。

数据持久性

数据持久性,简单地说就是将数据永久的存储起来,而实现持久化。

在之前的应用中,数据均保存在变量当中,而变量定义在 Activity 的内部,这就意味着变量 与 Activity 的生命周期相同,假如在应用运行的过程中用户动态的改变了变量的值,这时,每当 Activity 重新加载一次,内部的变量就会重新创建一次(变量的值就会变为默认值,而非用户动态更改的值),这是因为没有数据持久化。

对于即将要构建的 宠物应用也是如此,如果我们没有合理地存储输入到应用中的宠物信息,一旦 Activity 不再运行 这些信息就会丢失。

不同的存储类型选择

Android 使用的文件系统类似于其他平台上基于磁盘的文件系统。该系统为您提供了以下几种保存应用数据的选项:

可以看出 Android 应用中的文件存储方式主要分为三类:文件存储(应用专属存储空间或共享存储)、偏好设置(SharedPreferences)、数据库(Room、SQLite)。

下面有四种应用场景:

  1. “Video Everywhere”应用可以让你在度假的时候拍摄短片,并自动根据你去过的地点和拍摄短片的日期绘制一张地图。你该如何存储这些短片呢?

    **答案:**文件存储

  2. “Baking Conversion”应用可以对烘焙中遇到的各种单位进行转换,例如杯数转换成毫升,汤匙数转换为杯数。你该如何存储用户的单位偏好设置?

    **答案:**偏好设置

  3. “Music Share”应用可以使你购买和下载歌曲用于任何应用。你该如何存储这些歌曲?

    **答案:**文件存储

  4. 假设有一款应用可以存储进入收容所的宠物信息。你会使用什么来存储宠物信息?

    **答案:**数据库

还有一种情况,应用会同时使用不止一种的数据持久化方式。

现实生活中的数据库

到目前为止,已经见过两个在现实生活中用到数据库的示例:宠物收容所会存储关于动物的数据,以及在线零售商会存储关于库存的数据。

日程生活中,有各种需要采用数据库结构来存储信息的示例。下面再举两个例子。

银行账户

银行不仅非常依赖于关于用户的信息,还需要收集关于全球市场的信息,这样才能立足市场。可以想象出他们的数据库需要使用多个表格来汇总相关数据。

例如,他们会使用一个表格来记录单个用户的信息,例如用户 ID、支票账号、支票账户金额、储蓄账号、储蓄账户金额、用户的地址、用户的生日、用户名、密码等。还可能会使用另一个表格来记录更加通用的信息,例如货币汇率、信用卡利率、贷款利率等。

这些数据库中的信息都需要接受严密的监督,因为这些信息太重要了。听过“网络安全”一词吗?组织机构会专门设立一个部门来确保这些数据库的信息安全性。

航空公司

如果你在航空公司网站上预订过机票,经常就会需要输入飞行常客号码。航空公司可以利用该数据在存储客户信息的数据库表格中进行搜索,查找关于客户的其他信息。

该表格可能包含其他客户信息,例如姓名、地址、电话号码、飞行常客号码、信用卡信息、航班号码、座位号码等。

此外,航空公司需要表格来存储关于每日航班的信息。这些表格可能包含以下数据:飞机号、起飞机场、抵达机场、已售座位数、起飞时间、抵达时间、中转航班等。

航空公司会使用多个不同表格里的信息来帮助你选出抵达目的地最安全高效的方式。

SQLite 数据库

SQLite 是 Android 自带的数据库,不需要下载或安装任何内容就能在 Android 应用中使用 SQLite,虽然手机已经具有了 SQLite,但是计算机并没有预装 SQLite。

安装 SQLite

Windwos

Windows 系统中没有预装 SQLite 数据库系统,需要自行安装。

  1. 下载正确的 zip 文件。
  2. 创建一个文件夹,叫做 C:>sqlite,并将 zip 文件解压缩到这里面。
  3. 将 C:>sqlite 添加到你的 PATH 环境变量里。
  4. 在命令提示符窗口里输入 sqlite3 命令。

详细了解下这几个步骤。

要下载正确的文件,你需要转到此处并下载下面这两个文件:

sqlite-shell-win32-*.zipsqlite-dll-win32-*.zip

将这两个文件下载到计算机上后,打开 Windows 资源管理器并转到 C 盘,然后创建一个文件夹,叫做“sqlite”。将下载的 .zip 文件复制到该文件夹里,然后解压缩了。

完成上述操作后,你需要将 C:>sqlite 添加到系统的 PATH 环境变量里。如果你从未执行过这一操作,请按照这些步骤来操作。

最后,需要打开命令提示符程序,并输入 sqlite3,然后按下 Enter 键。

Mac OS X

最新版本的 OS X 已经预装了 SQLite,所以可能不需要执行任何操作。要查看是否预装了 SQLite,打开终端程序(可以从桌面的右上角找到该程序),输入 sqlite3,然后按下 Enter 键。如果出现的结果中包含“SQLite 版本”和一些数字,那就很幸运,预装了!

如果没有,则需要自己手动安装。为此,你需要下载相关文件,在终端程序中输入一些命令。

首先转到 此处 并下载 sqlite-autoconf-*.tar.gz。

然后打开终端,并输入以下命令。注意 $ 符号表示一行的开头位置,不需要输入。例如,对于最后一行,只需要输入“make install”,然后按下 Enter 键。

  $tar xvfz sqlite-autoconf-3071502.tar.gz
  $cd sqlite-autoconf-3071502
  $./configure --prefix=/usr/local
  $make
  $make install

输入这些命令后,Mac 上就安装好 SQLite 了!

第一次打开 SQLite

sqlite3 在命令提示符窗口里打开 sqlite3 程序的命令。

sqlite3 shelter.db 打开 sqlite3 程序并直接打开以下数据库文件的命令。可以将 shelter.db 替换为任何现有的数据库文件。

.open shelter.db sqlite 在程序中用来打开数据库文件的命令。在这里,打开的是 shelter.db 文件。可以将 shelter.db 替换为任何现有的其他 .db 文件。

.help 调出可用命令列表的命令

.quit 退出 sqlite 应用的命令

Windows 系统

echo %cd% echo 请求计算机向屏幕上输出内容。在这里,使用 %cd% 来要求计算机输出“当前目录”(即当前所处的目录)。

Mac 或 Linux系统

pwd 这一简写表示的是“当前工作目录”。和上述 Windows 命令一样,在屏幕上输出我们当前工作所处的目录。

sqlite3 在终端里打开 sqlite3 程序的命令。

SQLite 中的类型

大多数 SQL数据库引擎(据我们所知,除了SQLite之外的所有SQL数据库引擎)使用静态的、严格的类型。使用静态类型时,值的数据类型由其容器决定——存储值的特定列。SQLite 使用更通用的动态类型系统。在SQLite中,值的数据类型与值本身相关联,而不是与它的容器相关联。SQLite的动态类型系统向后兼容其他数据库引擎更常见的静态类型系统,因为在静态类型数据库上工作的SQL语句在SQLite中应该以同样的方式工作。然而,SQLite中的动态类型允许它做一些在传统的严格类型数据库中不可能做的事情。

存储在SQLite数据库中的每个值(或由数据库引擎操作)都有以下存储类之一:

SQLite没有单独的布尔存储类。相反,布尔值存储为整数0 (false)和1 (true)。

存储类比数据类型更通用。例如,整数存储类包括6种不同长度的整数数据类型。这在磁盘上造成了不同。但是一旦整数值从磁盘读取到内存中进行处理,它们就会被转换为最通用的数据类型(8字节有符号整数)。因此,在大多数情况下,“存储类”与“数据类型”是无法区分的,这两个术语可以互换使用。

SQLite version 3数据库中的任何列,除了整数主键列之外,都可以用来存储任何存储类的值。

假设在接下要构建的宠物应用中将存储的宠物信息有:Name(姓名)、Breed(品种)、Gender(性别)、Weight(体重/千克),并在 SQLite 数据库系统中使用如下存储类来存储宠物的每个信息。

设计和创建数据库

下面将创建一个 存储耳机信息的 SQLite数据库作为示例。

首先,使用 sqlite3 新建一个名为 store.db 的数据库文件:

PS C:\Users\blood\Desktop> sqlite3.exe shelter.db
SQLite version 3.32.2 2020-06-04 12:58:43
Enter ".help" for usage hints.
sqlite> .tables
sqlite> 

新建数据表语法参考:

CREATE TABLE <table_name>(
<column_name_1> <data_type_1>,
<column_name_2> <data_type_2>,
...);

创建 headphones 数据表,用于存储耳机的相关信息。

sqlite> CREATE TABLE headphones(_id INTEGER,
   ...> name TEXT,
   ...> price INTEGER,
   ...> style INTEGER,
   ...> in_stock INTEGER,
   ...> description TEXT);
sqlite> .tables
headphones
sqlite> .schema headphones
CREATE TABLE headphones(_id INTEGER,
name TEXT,
price INTEGER,
style INTEGER,
in_stock INTEGER,
description TEXT);
sqlite> PRAGMA TABLE_INFO(headphones);
0|_id|INTEGER|0||0
1|name|TEXT|0||0
2|price|INTEGER|0||0
3|style|INTEGER|0||0
4|in_stock|INTEGER|0||0
5|description|TEXT|0||0
sqlite> DROP TABLE headphones;
sqlite> .tables
sqlite> 

最后,要为宠物应用在 shelter.db 数据库中创建 pets 数据表:

其中 _id 字段作为每个宠物的唯一标识。

CREATE TABLE pets (_id INTEGER, name TEXT, breed TEXT, gender INTEGER, weight INTEGER);

快速提示

这里给出几个 SQLite 数据库中的提示。

  1. SQL 语句以半角分号作为结束符,这也意味着 可以将一个较长的 SQL 语句写成多行。
  2. 以小数点开头的指令是 sqlite3 特定的,比如 .quit 退出 sqlite3、.tables 查询所有表 等。
  3. sqlite3 的 小数点指令不属于 SQL 语言,且区分大小写,而 SQL 关键字不区分大小写
  4. 在 SQL 语句中关键字通常采用 全部大写,方便阅读。
  5. 在 SQLite 中使用键盘上的 向上向下 按钮可以切换使用过命令记录。

CRUD

CURD 概述

创建好表格后就可以向表格中添加行,并读取和操纵其中的数据,对表格执行的基本操作可以总结为一个词 CRUD。

CRUD 是与数据库相关的缩写,表示 Create(创建)、Read(读取)、Update(更新)和 Delete(删除)

插入 INSERT

INSERT 语句:

INSERT INTO <table_name>(
<column_name_1>,
<column_name_2>,
…)
VALUES (
<values_1>,
<values_2>,
…);

创建宠物表格

CREATE TABLE pets (_id, name, breed, gender, weight);

在第 1 行插入关于 Tommy 的信息

INSERT INTO pets (_id, name, breed, gender, weight) VALUES (1, "Tommy", "Pomeranian", 1, 4);

在第 2 行插入关于 Garfield 的数据

INSERT INTO pets (_id, name, breed, gender, weight) VALUES (2, "Garfield", "Tabby", 1, 8);

将模式改成 column

.mode column

显示表头

.header on

从宠物表格中读取所有的列和行

SELECT * FROM pets;

结果

_id         name        breed       gender      weight
----------  ----------  ----------  ----------  ----------
1           Tommy       Pomeranian  1           4
2           Garfield    Tabby       1           8

表格的局限

现在 pets 表格中已经有了两条数据:

sqlite> SELECT * FROM pets;
_id         name        breed       gender      weight
----------  ----------  ----------  ----------  ----------
1           Tommy       Pomeranian  1           4
2           Garfield    Tabby       1           8

现在 再插入一条数据:

sqlite> INSERT INTO pets (_id, name, breed, gender, weight) VALUES (1, "Binx", "Bomboy", 1, 5);
sqlite>
sqlite> SELECT * FROM pets;
_id         name        breed       gender      weight
----------  ----------  ----------  ----------  ----------
1           Tommy       Pomeranian  1           4
2           Garfield    Tabby       1           8
1           Binx        Bomboy      1           5

从输出内容可以看出,本来应该唯一的 _id 字段不再唯一。

如果再传入一条数据,并且忘记指定 宠物的名称:

sqlite> INSERT INTO pets (_id, breed, gender, weight) VALUES (3, "Bomboy", 1, 5);
sqlite>
sqlite> SELECT * FROM pets;
_id         name        breed       gender      weight
----------  ----------  ----------  ----------  ----------
1           Tommy       Pomeranian  1           4
2           Garfield    Tabby       1           8
1           Binx        Bomboy      1           5
3                       Bomboy      1           5

现在可以看到 id 为 3 的宠物姓名没有值,这在宠物收容所中是不应该存在的情况。

SQL 提供了一些便捷的关键字,帮助我们避免出现 上述情况,比如:

这只是一部分,并没有列全,但对应 pets 表格来说已经够够用了。

我们希望 pets 数据表的 id 字段作为唯一标识,并且 name 字段不能为空,在相应的字段后 添加约束条件。

先使用 SQL 命令 DROP TABLE pets; 删除已有的数据表,然后重新创建 pets 数据表:

sqlite> DROP TABLE pets;
sqlite>
sqlite> CREATE TABLE pets(
   ...> _id INTEGER PRIMARY KEY AUTOINCREMENT,
   ...> name TEXT NOT NULL,
   ...> breed TEXT,
   ...> gender INTEGER,
   ...> weight INTEGER);
sqlite> 
sqlite> PRAGMA TABLE_INFO(pets);
cid         name        type        notnull     dflt_value  pk
----------  ----------  ----------  ----------  ----------  ----------
0           _id         INTEGER     0                       1
1           name        TEXT        1                       0
2           breed       TEXT        0                       0
3           gender      INTEGER     0                       0
4           weight      INTEGER     0                       0

这时 id 字段已经可以自增长,所以在插入数据时不必 指定 id 字段的值:

sqlite> INSERT INTO pets (name, breed, gender, weight) VALUES ("Tommy", "Pomeranian", 1, 4);
sqlite>
sqlite> INSERT INTO pets (name, breed, gender, weight) VALUES ("Garfield", "Tabby", 1, 8);
sqlite>
sqlite> SELECT * FROM pets;
_id         name        breed       gender      weight
----------  ----------  ----------  ----------  ----------
1           Tommy       Pomeranian  1           4
2           Garfield    Tabby       1           8

如果插入一条 id 已经存在的数据,则会报错,因为 id 应该唯一,比如 1:

sqlite> INSERT INTO pets (_id, name, breed, gender, weight) VALUES (1, "Binx", "Bomboy", 1, 5);
Error: UNIQUE constraint failed: pets._id

同样的,插入一条 name 字段为空的数据也会报错,因为不允许为空:

sqlite> INSERT INTO pets (_id, breed, gender, weight) VALUES (3, "Bomboy", 1, 5);
Error: NOT NULL constraint failed: pets.name

下面对 pets 表中剩下的几个字段添加约束(先删除现有的 pets 数据表)。

sqlite> DROP TABLE pets;
sqlite>
sqlite> CREATE TABLE pets (
   ...>      _id INTEGER PRIMARY KEY AUTOINCREMENT,
   ...>      name TEXT NOT NULL,
   ...>      breed TEXT,
   ...>      gender INTEGER NOT NULL,
   ...>      weight INTEGER NOT NULL DEFAULT 0);
sqlite>
sqlite> PRAGMA TABLE_INFO(pets);
cid         name        type        notnull     dflt_value  pk
----------  ----------  ----------  ----------  ----------  ----------
0           _id         INTEGER     0                       1
1           name        TEXT        1                       0
2           breed       TEXT        0                       0
3           gender      INTEGER     1                       0
4           weight      INTEGER     1           0           0

解释:

CREATE TABLE

用来创建新的表格的 SQL 关键字

pets

指的是要创建的表格的名称

_id INTEGER PRIMARY KEY AUTOINCREMENT,

表格的第一列将称为 _id,类型为 INTEGER。因为我们希望将其作为表格行的 ID,所以使用关键字 PRIMARY KEY。当新的行创建后,我们希望 ID 能自动按升序增大,所以使用关键字 AUTOINCREMENT

name TEXT NOT NULL,

名称的数据类型为 TEXT。我们用关键字 NOT NULL 表明此列必须具有值。

breed TEXT,

品种的数据为 TEXT。因为是选填的,所以我们不需要关键字 NOT NULL

gender INTEGER NOT NULL,

性别的数据类型为 INTEGER(0 - 未知,1 - 公,2 - 母)。我们用关键字 NOT NULL 表明此列必须具有值。

weight INTEGER NOT NULL DEFAULT 0);

体重的数据类型为 INTEGER。我们用关键字 NOT NULL 表明此列必须具有值。我们用 DEFAULT 0 表示默认值将为 0(如果未提供)。

选择、位置和排序

当数据表中的数据 有很多时,我们可能只关心 满足特定条件的 信息,比如 5 岁以上的宠物、不足 18 千克的宠物,或是同时满足多个条件的宠物。

在此之前先插入一些数据:

sqlite> INSERT INTO pets (name, breed, gender, weight) VALUES ( "Tommy", "Pomeranian", 1, 4);
sqlite> INSERT INTO pets (name, breed, gender, weight) VALUES ("Garfield", "Tabby", 1, 14);
sqlite> INSERT INTO pets (name, breed, gender, weight) VALUES ("Binx", "Bombay", 1, 6);
sqlite> INSERT INTO pets (name, breed, gender, weight)  VALUES ( "Lady", "Cocker Spaniel", 2, 14);
sqlite> INSERT INTO pets (name, breed, gender, weight) VALUES ("Duke", "Unknown", 1, 70);
sqlite> INSERT INTO pets (name, breed, gender, weight) VALUES ("Cat", "Tabby", 0, 7);
sqlite> INSERT INTO pets (name, breed, gender, weight) VALUES ("Baxter", "Border Terrier", 1, 8);
sqlite> INSERT INTO pets (name, gender, weight) VALUES ("Arlene", 2, 5);
sqlite>
sqlite> SELECT * FROM pets;
_id         name        breed       gender      weight
----------  ----------  ----------  ----------  ----------
1           Tommy       Pomeranian  1           4
2           Garfield    Tabby       1           14
3           Binx        Bombay      1           6
4           Lady        Cocker Spa  2           14
5           Duke        Unknown     1           70
6           Cat         Tabby       0           7
7           Baxter      Border Ter  1           8
8           Arlene                  2           5

WHERE 关键字可以指定要查询的条件,WHERE 子句确保只有符合指定条件的行受到影响,可以与 SELECT、INSERT、UPDATE或DELETE语句一起使用。

分别查询 id 等于 3 和 体重大于等于 18 千克的宠物

sqlite> SELECT * FROM pets WHERE _id == 3;
_id         name        breed       gender      weight
----------  ----------  ----------  ----------  ----------
3           Binx        Bombay      1           6
sqlite> 
sqlite> SELECT * FROM pets WHERE weight >= 18;
_id         name        breed       gender      weight
----------  ----------  ----------  ----------  ----------
5           Duke        Unknown     1           70

使用 AND 关键字来组合查询条件:

性别为雄性,且 体重大于 10 千克的宠物

sqlite> SELECT * FROM pets WHERE gender == 1 AND weight > 10;
_id         name        breed       gender      weight
----------  ----------  ----------  ----------  ----------
2           Garfield    Tabby       1           14
5           Duke        Unknown     1           70

ORDER BY 对查询结果进行排序根据列出的列,按升序(ASC)或降序(DESC)对数据进行排序:

sqlite> SELECT * FROM pets WHERE _id <= 5 ORDER BY name;
_id         name        breed       gender      weight
----------  ----------  ----------  ----------  ----------
3           Binx        Bombay      1           6
5           Duke        Unknown     1           70
2           Garfield    Tabby       1           14
4           Lady        Cocker Spa  2           14
1           Tommy       Pomeranian  1           4

查询 雌性宠物的 姓名和体重,并按体重从高到底排序:

sqlite> SELECT name, weight FROM pets WHERE gender == 2 ORDER BY weight DESC;
name        weight
----------  ----------
Lady        14
Arlene      5

更新 UPDATE

有一只宠物的体重超过了 50 千克,宠物管理员对它进行了减肥,这时就需要在宠物信息表中 更改这只宠物的体重信息 为 40 千克。

sqlite> SELECT _id, name, weight FROM pets WHERE weight > 50;
_id         name        weight
----------  ----------  ----------
5           Duke        70

更改表中的数据可以使用 UPDATE 语句实现,语法:

UPDATE <table_name>
SET <column_name> = <value>
WHERE <condition>;

使用 UPDATE 语句更新 宠物的体重值:

sqlite> UPDATE pets SET weight = 40 WHERE _id = 5;
sqlite> 
sqlite> SELECT _id, name, weight FROM pets WHERE _id = 5;
_id         name        weight
----------  ----------  ----------
5           Duke        40

有一天,宠物收容所的称出了问题,所有宠物都要进行重新称重,在这之前需要把所有宠物 的体重改为 0 千克:

sqlite> UPDATE pets SET weight = 0;
sqlite> 
sqlite> SELECT _id, name, weight FROM pets;
_id         name        weight
----------  ----------  ----------
1           Tommy       0
2           Garfield    0
3           Binx        0
4           Lady        0
5           Duke        0
6           Cat         0
7           Baxter      0
8           Arlene      0

删除 DELETE

最后要了解的数据库操作是将所有错误地输入输入到数据库中的宠物删掉。

DELETE 语句可以实现从表中删除数据,语法:

DELETE FROM <table_name> WHERE <condition>;

这是为删除任何数据之前的 所有宠物信息:

sqlite> SELECT *  FROM pets;
_id         name        breed       gender      weight
----------  ----------  ----------  ----------  ----------
1           Tommy       Pomeranian  1           0
2           Garfield    Tabby       1           0
3           Binx        Bombay      1           0
4           Lady        Cocker Spa  2           0
5           Duke        Unknown     1           0
6           Cat         Tabby       0           0
7           Baxter      Border Ter  1           0
8           Arlene                  2           0

下面将 性别 未知的宠物信息:

sqlite> DELETE FROM pets WHERE gender = 0;
sqlite> 
sqlite> SELECT *  FROM pets;
_id         name        breed       gender      weight
----------  ----------  ----------  ----------  ----------
1           Tommy       Pomeranian  1           0
2           Garfield    Tabby       1           0
3           Binx        Bombay      1           0
4           Lady        Cocker Spa  2           0
5           Duke        Unknown     1           0
7           Baxter      Border Ter  1           0
8           Arlene                  2           0

宠物性别为 雄性 且 id 大于 5 的宠物信息有误,需要进行删除:

sqlite> DELETE FROM pets WHERE gender = 1 AND _id > 5;
sqlite> 
sqlite> select * from  pets;
_id         name        breed       gender      weight
----------  ----------  ----------  ----------  ----------
1           Tommy       Pomeranian  1           0
2           Garfield    Tabby       1           0
3           Binx        Bombay      1           0
4           Lady        Cocker Spa  2           0
5           Duke        Unknown     1           0
8           Arlene                  2           0

如果 店内所有的宠物都 被人领养走了,则需要删除所有的宠物信息:

sqlite> DELETE FROM pets;
sqlite>
sqlite> SELECT * FROM pets;
sqlite>

总结

现在已经知道如何处理数据库中的数据了,先创建了一个数据库,然后在其中创建了数据表。然后讨论了如何向表格中插入行,并更新和删除这些行。接着又 使用了 WHERE 条件 和 ORDER BY 排序 来查询数据,并获得关心的行和列。

SQLite 中的存储类的使用十分灵活,即使声明了字段的存储类,也仍然可以插入任意类型的值,这也解释了为什么创建表时可以不=声明字段类型。

参考

计算机内存和硬盘存储空间之间的区别

数据和文件存储概览

关于 SQL 和 SEQUEL 之间区别的有趣讨论:

有些人发成“S-Q-L”,有些人叫成“sequel”,都指的是同一概念。追溯下历史:缩写“SEQUEL”后来改成了 SQL,因为”SEQUEL“是一家英国航空公司 Hawker Siddeley商标

SQL 维基百科界面

详细了解 SQLite 中的数据类型,请点击此处

Command Line Shell For SQLite

标签:sqlite,name,weight,安卓,Day15,pets,----------,日志,id
来源: https://blog.csdn.net/weixin_45075891/article/details/113576942