美文网首页
了解SQLite数据库

了解SQLite数据库

作者: CoderShang | 来源:发表于2019-08-28 11:50 被阅读0次

    Android对数据库的使用是很重要的操作,由此开始系统的学习吧~

    目录

    • 1.SQLite是什么
    • 2.使用
    • 3.SQLite语句
    • 4.Android使用SQLite

    1 SQLite是什么

    SQLite 是一个进程内的库,不需要在系统中配置。通过静态或动态连接,使其直接访问存储的文件。
    SQLite 是非常小的,是轻量级的,完全配置时小于 400KB,省略可选功能配置时小于250KiB。
    SQLite(关系型数据库) 事务是完全兼容 ACID 的,允许从多个进程或线程安全访问。

    与之进行交互的命令类似于 SQL,命令包括:

    • CREATE:创建一个新的表,一个表的视图,或者数据库中的其他对象。
    • ALTER:修改数据库中的某个已有的数据库对象,比如一个表。
    • SELECT:从一个或多个表中检索某些记录。
    • INSERT:创建一条记录。
    • UPDATE:修改记录。
    • DELETE:删除记录。
    • DROP:删除整个表,或者表的视图,或者数据库中的其他对象。

    2 使用(需要Root❗️)

    2.1 安装

    客户端开发无需安装SQLite,如要安装在电脑上请参考Windows & Mac 安装
    Android手机和7.0以上的模拟器是没root权限的!本文使用的是6.0模拟器,默认root。

    2.2 使用SQLite命令

    ⚠️注意:# 符号表示已经root了,如果是 $ 美元符号,则说明没有root,不可以使用sqlite命令!建议使用6.0的Android模拟器❗️
    由于不知道文章编辑器怎么转义,以下所有 # 被我替换成了 >
    shell进去后键入一个简单的sqlite3命令,即可进入数据库模式:

    $ adb shell
    root@generic_x86_64:/ > sqlite3
    SQLite version 3.8.10.2 2015-05-20 18:17:19
    Enter ".help" for usage hints.
    Connected to a transient in-memory database.
    Use ".open FILENAME" to reopen on a persistent database.
    sqlite>
    

    .help命令获取帮助 :

    sqlite>.help
    

    部分 SQLite 命令如下:

    命令 描述
    .backup ?DB? FILE 备份 DB 数据库(默认是 "main")到 FILE 文件。
    .databases 列出数据库的名称及其所依附的文件。
    .exit 退出 SQLite 提示符。
    .help 显示消息。
    .echo ON/OFF 开启或关闭 echo 命令。
    .header(s) ON/OFF 开启或关闭头部显示。
    .import FILE TABLE 导入来自 FILE 文件的数据到 TABLE 表中。
    .load FILE ?ENTRY? 加载一个扩展库。
    .nullvalue STRING 在 NULL 值的地方输出 STRING 字符串。
    .output FILENAME 发送输出到 FILENAME 文件。
    .output stdout 发送输出到屏幕。
    .stats ON/OFF 开启或关闭统计。
    .quit 退出 SQLite 提示符。
    .read FILENAME 执行 FILENAME 文件中的 SQL。
    .show 显示各种设置的当前值。
    .timeout MS 尝试打开锁定的表 MS 毫秒。
    .width NUM NUM 为 "column" 模式设置列宽度。
    .timer ON/OFF 开启或关闭 CPU 定时器。

    让我们尝试使用.show命令,来查看 SQLite 命令提示符的默认设置:

    sqlite>.show
            echo: off
             eqp: off
         explain: auto
         headers: off
            mode: list
       nullvalue: ""
          output: stdout
    colseparator: "|"
    rowseparator: "\n"
           stats: off
           width: 
        filename: :memory:
    sqlite> 
    

    确保sqlite>提示符与点命令之间没有空格,否则将无法正常工作。

    使用下列的命令配置 (后面查询的时候更好看一些):

    sqlite>.header on
    sqlite>.mode column
    sqlite>.timer on
    sqlite>
    

    为了便于学习,我们在/data目录下创建test文件夹,然后创建名为DBtest.db的数据库文件(>后面是shell命令):

    $ adb shell
    root@generic_x86_64:/data > mkdir test    
    root@generic_x86_64:/data > cd test/                                           
    root@generic_x86_64:/data/test > sqlite3 DBtest.db                             
    SQLite version 3.8.10.2 2015-05-20 18:17:19
    Enter ".help" for usage hints.
    sqlite> 
    

    使用sqlite3 DBtest.db命令,进入一个数据库。
    sqlite_master表存储了数据库所有表的关键信息,我们可以查询此表的概要(由于刚创建完数据库,此表中还无任何数据):

    sqlite>.schema sqlite_master
    CREATE TABLE sqlite_master (
      type text,
      name text,
      tbl_name text,
      rootpage integer,
      sql text
    );
    

    现在,我们创建了SQLite数据库,.databases命令来检查它是否在数据库列表中,如下所示:

    sqlite>.databases        
    seq  name             file                                                      
    ---  ---------------  ----------------------------------------------------------
    0    main             /data/test/DBtest.db                                      
    sqlite>
    

    我们能看到这是个列表,就是说还会有其他数据库在里面,其实SQLite还可以创建此库的其他关联库,如:

    导出数据库:使用.dump命令将数据库完整的导出到一个文本文件中:

    root@generic_x86_64:/data/test > sqlite3 testDB.db .dump > testDB.sql
    root@generic_x86_64:/data/test > ls
    DBtest.db
    DBtest.sql
    root@generic_x86_64:/data/test > 
    

    我们也可以从一个文件恢复一个数据库:

    sqlite3 testDB.db < testDB.sql
    

    sqlite>表示所处于数据库中,如果想出去,可以使用.quit.exit 命令退出 sqlite 提示符

    sqlite>.quit
    

    3 SQLite语句

    3.1 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 亲和类型 我们暂时先不学习。
    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 算起的秒数。

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

    3.2 SQLite语句

    SQLite 是不区分大小写的,但也有一些命令是大小写敏感的,比如 GLOB 和 glob 就有不同的含义。
    所有的 SQLite 语句可以以任何关键字开始,如SELECTINSERTUPDATEDELETEALTERDROP等,必须以分号;结束。

    ⚠️注意,由于sqlit>提示符下不支持Tab键,不支持箭头,要谨慎些,若漏掉;分号就执行了,会提示补齐命令:...>在其后面继续敲就好了

    3.2.1 创建表

    现在,让我们创建一个表(COMPANY公司):

    // COMPANY表,ID 作为主键(PRIMARY KEY),NOT NULL约束表示在表中创建纪录时这些字段不能为 NULL
    sqlite> CREATE TABLE COMPANY(
       ID INT PRIMARY KEY     NOT NULL,
       NAME           TEXT    NOT NULL,
       AGE            INT     NOT NULL,
       ADDRESS        CHAR(50),
       SALARY         REAL
    ); 
    // 复制进去,末尾若出现...> 符号不要慌,按下Enter执行就好
    

    使用.tables查看是否创建成功:

    sqlite>.tables
    COMPANY
    

    可以使用.schema 表名命令得到表的完整信息,如下所示:

    sqlite>.schema COMPANY
    CREATE TABLE COMPANY(
       ID INT PRIMARY KEY     NOT NULL,
       NAME           TEXT    NOT NULL,
       AGE            INT     NOT NULL,
       ADDRESS        CHAR(50),
       SALARY         REAL
    );
    

    删除表也很简单:

    sqlite> DROP TABLE COMPANY;
    
    3.2.2 添加数据

    INSERT INTO 语句有两种基本语法(下面的语句将在 COMPANY 表中创建六个记录):

    INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY)
    VALUES (1, 'Paul', 32, 'California', 20000.00 );
    
    INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY)
    VALUES (2, 'Allen', 25, 'Texas', 15000.00 );
    
    INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY)
    VALUES (3, 'Teddy', 23, 'Norway', 20000.00 );
    
    INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY)
    VALUES (4, 'Mark', 25, 'Rich-Mond ', 65000.00 );
    
    INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY)
    VALUES (5, 'David', 27, 'Texas', 85000.00 );
    
    INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY)
    VALUES (6, 'Kim', 22, 'South-Hall', 45000.00 );
    

    或:

    INSERT INTO COMPANY VALUES (7, 'James', 24, 'Houston', 10000.00 );
    

    使用一个表来填充另一个表:
    可以通过在一个有一组字段的表上使用 select 语句,填充数据到另一个表中:

    INSERT INTO first_table_name [(column1, column2, ... columnN)] 
       SELECT column1, column2, ...columnN 
       FROM second_table_name
       [WHERE 查询条件];
    
    3.2.3 SELECT查询

    我们可以查询一下表数据 如果没有配置如下格式化设置,可以设置一下:

    sqlite> .header on
    sqlite> .mode column
    sqlite> .timer on            
    sqlite> SELECT * FROM COMPANY;
    ID          NAME        AGE         ADDRESS     SALARY    
    ----------  ----------  ----------  ----------  ----------
    1           Paul        32          California  20000.0   
    2           Allen       25          Texas       15000.0   
    3           Teddy       23          Norway      20000.0   
    4           Mark        25          Rich-Mond   65000.0   
    5           David       27          Texas       85000.0   
    6           Kim         22          South-Hall  45000.0   
    Run Time: real 0.001 user 0.000000 sys 0.000000
    

    格式化查询必须在每个库里面单独配置

    只想获取 COMPANY 表中指定的字段,则使用下面的查询:

    sqlite> SELECT ID, NAME, SALARY FROM COMPANY;
    

    本文只介绍SQLite命令和简单sql语句,有关 详细SQL语句请点击查看

    4. Android使用SQLite

    有个Demo还没做完,持续更新中,可供参考一个基于SQLite实现的待办App

    相关文章

      网友评论

          本文标题:了解SQLite数据库

          本文链接:https://www.haomeiwen.com/subject/fdqssctx.html