Sqlite 使用

Posted 呓语

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Sqlite 使用相关的知识,希望对你有一定的参考价值。

SQLite 数据类型

SQLite 数据类型是一个用来指定任何对象的数据类型的属性。SQLite 中的每一列,每个变量和表达式都有相关的数据类型。

您可以在创建表的同时使用这些数据类型。SQLite 使用一个更普遍的动态类型系统。在 SQLite 中,值的数据类型与值本身是相关的,而不是与它的容器相关。

SQLite 存储类

每个存储在 SQLite 数据库中的值都具有以下存储类之一:

存储类 描述
NULL 值是一个 NULL 值。
INTEGER 值是一个带符号的整数,根据值的大小存储在 1、2、3、4、6 或 8 字节中。
REAL 值是一个浮点值,存储为 8 字节的 IEEE 浮点数字。
TEXT 值是一个文本字符串,使用数据库编码(UTF-8、UTF-16BE 或 UTF-16LE)存储。
BLOB 值是一个 blob 数据,完全根据它的输入存储。

SQLite 的存储类稍微比数据类型更普遍。INTEGER 存储类,例如,包含 6 种不同的不同长度的整数数据类型。

SQLite Affinity 类型

SQLite 支持列上的类型 affinity 概念。任何列仍然可以存储任何类型的数据,但列的首选存储类是它的 affinity。在 SQLite3 数据库中,每个表的列分配为以下类型的 affinity 之一:

Affinity 描述
TEXT 该列使用存储类 NULL、TEXT 或 BLOB 存储所有数据。
NUMERIC 该列可以包含使用所有五个存储类的值。
INTEGER 与带有 NUMERIC affinity 的列相同,在 CAST 表达式中带有异常。
REAL 与带有 NUMERIC affinity 的列相似,不同的是,它会强制把整数值转换为浮点表示。
NONE 带有 affinity NONE 的列,不会优先使用哪个存储类,也不会尝试把数据从一个存储类强制转换为另一个存储类。

SQLite Affinity 及类型名称

下表列出了当创建 SQLite3 表时可使用的各种数据类型名称,同时也显示了相应的应用 Affinity:

数据类型 Affinity
INTINTEGERTINYINTSMALLINTMEDIUMINTBIGINTUNSIGNED BIG INTINT2INT8 INTEGER
CHARACTER(20)VARCHAR(255)VARYING CHARACTER(255)NCHAR(55)NATIVE CHARACTER(70)NVARCHAR(100)TEXTCLOB TEXT
BLOBno datatype specified NONE
REALDOUBLEDOUBLE PRECISIONFLOAT REAL
NUMERICDECIMAL(10,5)BOOLEANDATEDATETIME NUMERIC

Boolean 数据类型

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

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 算起的秒数。

可以以任何上述格式来存储日期和时间,并且可以使用内置的日期和时间函数来自由转换不同格式。

SQL 常用命令

  1. 获取最后插入的自动增量的值
select last_insert_rowid();
  1. 查看建表语句
# 不加 table_name 则查看所有的
.schema table_name
  1. 查看更详细的信息
.mode column
.headers on
select * from sqlite_master;
  1. 将数据保存为sql文件
# 导出sql文件
.output sql_file_name
.dump
.output stdout

#  导出CSV文件
.output file.csv
.separator
select * from table_name;
.output stdout
#  导出csv文件2
.output file.csv
.mode csv
select * from table_name;
.output stdout
# 方法1 和 2 的区别时 2会自动换行 字段值并将其加上双引号,而列模式不加

# 直接导出数据
sqlite3 test.db .dump > test.sql
# 创建数据库的两种方法
sqlite3 test.db < test.sql
# 加上.exit 是因为不想进入 sqlite shell 命令界面
sqlite3 -init test.sql test.db .exit

4.1 导入数据文件

# sql 文件
.read file.sql
# 有分隔符的文件
# 1. 查看当前指定的分隔符
.show 
# separator -> "|"
# 2. 指定不同的分隔符
.separator
# 3. 导入文件
.import [file] [table]
  1. 查看表信息
sqlite>.tables                                                --查看当前数据库所有表  
sqlite>.tables table_name                                     --查看当前数据库指定表
sqlite>.schema                                                --查看当前数据库所有表的建表(CREATE)语句 
sqlite>.schema table_name                                     --查看指定数据表的建表语句 
sqlite>select * from sqlite_master from;                      --查看所有表结构及索引信息 
sqlite>select * from sqlite_master where type=‘table‘;        --查看所有表结构信息 
sqlite>select name from sqlite_master where type=‘table‘;     --对于表来说,name字段指表名,查询所有表
sqlite>select * from sqlite_master where type=‘table‘ and name=‘table_name‘;     --查看指定表结构信息 
sqlite>select * from sqlite_master where type=‘index‘;        --查看所有表索引信息,查询所有索引 
sqlite>select name from sqlite_master where type=‘table‘;     --对于索引来说,name字段指索引名
sqlite>select * from sqlite_master where type=‘index‘ and name=‘table_name‘; --查看指定表索引信息
sqlite>pragma table_info (‘table_name‘)                       --查看指定表所有字段信息,类似于msyql:desc table_name
sqlite>select typeof(‘column‘) from table_name;               --查看指定表字段【column】类型,括号内可不输引号 
  1. 清空表数据
delete from [tablename]
//1. 将表名为tablename的自增量置0
update sqlite_sequence set seq = 0 where name = ‘tablename‘

//2. 将表名为tablename的记录删除
delete from sqlite_sequence where name = ‘tablename‘

//3. 将sqlite_sequence表清空数据
delete from sqlite_sequence
  1. 建表
create table contacts (
    id integer primary key, -- 设置主键
    name text not null collate nocase, -- 不能为空 排序时 忽略大小写
    phone text not null default ‘unknown‘, -- 设置默认值
    uniqe (name, phone) --
);
  1. 修改表
alert table contacts add column email text not null default ‘‘ collate nocase;
  1. 查询语句
select [distinct] heading
from tables
where predicate
group by columns
having predicate
order by columns
limit count, offset;

以上是关于Sqlite 使用的主要内容,如果未能解决你的问题,请参考以下文章

Android 逆向使用 DB Browser 查看并修改 SQLite 数据库 ( 从 Android 应用数据目录中拷贝数据库文件 | 使用 DB Browser 工具查看数据块文件 )(代码片段

SQLite 片段函数实现不会在 TextView 中将文本格式化为 HTML

如何在片段中访问 SQLite 数据到 ListView

java.lang.NullPointerException: Attempt to invoke virtual method ‘int android.database.sqlite异常(代码片段

如何使用光标和循环显示来自 sqlite 的片段的 recyclerview

如何使用列表视图在选项卡式活动的片段中呈现 SQLite 表数据 [重复]