(可跳过这段来自本up的罗里吧嗦。。。)
在做上一个项目的时候,需要用到本地数据库,以前做公司项目用的是轻量级数据库Realm,做自己小项目用的是greenDAO,大学学的是SQL server,但是在flutter中,相关插件用的数据库是SQLite(sqflite插件),但本人还没接触过SQLite,问了后台同事,他们用的也是SQLite,说大同小异,我就想着仅凭大学记忆,快速过一遍SQLite知识点,应该挺快的,想着抓点重要的就够了。现在项目告一段落,就来写这篇博客记录一下(感觉有点标题党了哈哈哈)。
小重点:
1、SQLite 是不区分大小写的,但也有一些命令是大小写敏感的,比如 GLOB 和 glob 在 SQLite 的语句中有不同的含义。
2、注释大法:
(1)-- 这是一句注释
(2)/* 这是一句注释 */
用于指定任何对象的数据类型的属性。
1、存储类
(1)NULL:NULL值(空值)。
(2)INTEGER:带符号的整数。
(3)REAL:浮点值。
(4)TEXT:文本字符串值。
(5)BLOB:二进制大对象,Binary Large Object。
2、亲和类型(优先采用)
当数据插入时,该字段的数据将会优先采用亲缘类型作为该值的存储方式。
(1)TEXT:数值型数据插入前先转为文本格式再插入。
(2)NUMERIC:如果转换操作不会导致数据丢失以及完全可逆,则会转换为INTEGER和REAL,如果失败则会以TEXT存储。对于NULL和BLOB类型则不作类型转换存储。注意:浮点类型的文本,如"300.0",转为INTEGER不会丢失数值信息,则会转换为INTEGER类型存储。
(3)INTEGER:基本等同于NUMERIC,区别在于执行CAST表达式(转换类型)时。
eg: 将column字段 文本类型转换为INTEGER类型。
SELECT * FROM Table ORDER BY CAST (column as INTEGER);
(4)REAL:基本等同于NUMERIC,区别在于不会将"300.0"这样的文本数据转为INTEGER类型存储。
(5)NONE:不做转换,以数据本身的数据类型存储。
3、SQLite 亲和类型(Affinity)及类型名称(以下作了解)
数据类型 | 亲和类型 |
---|---|
|
INTEGER |
|
TEXT |
|
NONE |
|
REAL |
|
NUMERIC |
4、Boolean数据类型
SQLite 没有单独的 Boolean 存储类。相反,布尔值被存储为整数 0(false)和 1(true)。
注:在我的项目中,直接存储为INTEGER类型,0为false,1为true。
5、Date 与 Time数据类型
SQLite 没有一个单独的用于存储日期和/或时间的存储类,但 SQLite 能够把日期和时间存储为 TEXT、REAL 或 INTEGER 值。
注:在我的项目中,存储的是时间戳,要用时取出时间戳转换为具体的时间格式 [文本字符串] 显示。
存储类 | 日期格式 |
---|---|
TEXT | 格式为 "YYYY-MM-DD HH:MM:SS.SSS" 的日期。 |
REAL | 从公元前 4714 年 11 月 24 日格林尼治时间的正午开始算起的天数。 |
INTEGER | 从 1970-01-01 00:00:00 UTC 算起的秒数。 |
1、创建、附加、分离数据库
在此教程不作sqlite的数据操作的详细讲解,后续有时间补充。
原因:移动端的数据库操作一般根据插件的语句来。
SQLite语句是以关键字开始,分号结束的语句。
关键字:SELECT、INSERT、UPDATE、DELETE、ALTER、DROP。
注:在此提出关注 ALTER 关键字,本人因为把 ALTER 写成 ALERT 导致语句执行错误。
1、表的创建
基本语法:(每一字段用逗号隔开,最后一个字段不用写逗号)
CREATE TABLE database_name.table_name(
column1 datatype PRIMARY KEY(one or more columns),
column2 datatype,
column3 datatype,
.....
columnN datatype
);
eg:创建三张公司表,字段id自增,名称不为空,年龄不为空,工作岗位,工资。(结合Flutter中 sqflite 插件的语句写法。)
CREATE TABLE Company(
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
age INTEGER NOT NULL,
job TEXT,
salary R