iOS应用数据持久化(二)之SQLite3

409 阅读7分钟

###一、数据库是什么? SQL语言简洁,语法简单,易学易用 SQL(structured query language):是一种结构化查询语言 SQL是一种对关系型数据库中的数据进行定义和操作的语言

###二、SQLite 数据库是什么?

SQLite百科

SQLite百科介绍

###三、SQL语句的种类 *1. DDL(Data Definition Language) - 数据定义语句

| 命令 |描述 | | ------------- |:------------- -----:| |CREATE | 创建一个新的表,一个表的视图,或者数据库中的其他对象 | | ALTER | 修改数据库中的某个已有的数据库对象,比如一个表 | | DROP | 删除整个表,或者表的视图,或者数据库中的其他对象 |

*2. DML(Data Manipulation Language) - 数据操作语句

| 命令 |描述 | | ------------- |:------------- -----:| |INSERT |新增数据 | | UPDATE | 修改数据库中的某个已有的数据库对象,比如一个表 | |DELETE | 删除整个表,或者表的视图,或者数据库中的其他对象 |

*3. DQL(Data Query Language) - 数据查询语句

| 命令 |描述 | | ------------- |:------------- -----:| |SELECT |查询数据 | ###四、条件语句的介绍 如果只想更新或者删除某些固定的记录,那就必须在DML语句后加上一些条件 条件语句的常见格式 ####1.WHERE | WHERE |判断 | 注释| | ------------- |:------------- -----:| |where |字段 = 某个值 | 不能用==(两个等号) | |where |字段 is 某个值 |is 相当于 = | |where |字段 != 某个值 |~| |where |字段 is not 某个值 |is not 相当于 != | |where |字段 > 某个值|~| |where |字段1 = 某个值 and 字段2 > 某个值 |and相当于C语言中的 && |

另外:
where    字段1 = 某个值 or 字段2 = 某个值    //or 相当于C语言中的 ||
示例
将t_zorn表中姓名等于zorn 并且电话不等于110的记录
update t_zorn set name = 'zorn' where number != 110 ;```
####2.LIKE
| 语句        |描述 |
| ------------- |:------------- -----:|
|WHERE number LIKE '110%'     | 查找以110开头的任意值 |
| WHERE number LIKE '%110%'      | 查找任意位置包含110的任意值 |
|WHERE number LIKE '_10%' |查找第二位和第三位为10的任意值|
|WHERE number LIKE '0_%_%'     | 查找以0开头,且长度至少为3个字符的任意值 |
| WHERE number LIKE '%112'      |查找以112结尾的任意值 |
|WHERE number LIKE '_1%2' |查找第二位为1,且以2结尾的任意值|
|WHERE number LIKE '2__3' |查找长度为5位数,且以2开头以3结尾的任意值|

注意:⚠️ %是转义字符,两个%才表示一个%``` ####3.LIMIT 使用limit可以精确地控制查询结果的数量,比如每次只查询10条数据 格式 select * from 表名 limit 数值1, 数值2 ; 示例
select * from t_zorn limit 4, 8 ;

可以理解为:跳过最前面4条语句,然后取8条记录 limit常用来做分页查询,比如每页固定显示5条数据,那么应该这样取数据

| 页数 |LIMIT | 数值| | ------------- |:------------- -----:| |第1页 |limit | 0, 5 | |第2页 |limit |5, 5 | |第3页 |limit |10, 5| |... || | |第n页 |limit|5*(n-1), 5|

``` select * from t_zorn limit 7 ;这条语句的作用相当于select * from t_student limit 0, 7 ;表示取最前面的7条记录



###五、SQLite语法介绍
#####1)SQLite将数据划分为以下几种存储类型:

integer 整型值,根据值的大小存储在 1、2、3、4、6 或 8 字节中。 real 浮点值,存储为 8 字节的 IEEE 浮点数字。 text 文本字符串,使用数据库编码(UTF-8、UTF-16BE 或 UTF-16LE)存储。 blob 二进制数据,根据它的输入存储。```

注意:实际上SQLite是无类型的,就算声明为integer类型,还是能存储字符串文本(主键除外) 建表时声明啥类型或者不声明类型都可以,也就意味着创表语句可以这么写: create table t_zorn(name, number); 提示:为了保持良好的编程规范、方便程序员之间的交流,编写建表语句的时候最好加上每个字段的具体类型   #####2)sqlite 的方法简介

sqlite3     *db, 数据库的象征(句炳),跟文件句柄FILE很类似
sqlite3_open(),  打开数据库,没有数据库时创建。
sqlite3_exec(),  执行非查询的sql语句
Sqlite3_step(), 在调用sqlite3_prepare后,使用这个函数在记录集中移动。
Sqlite3_close(), 关闭数据库文件
sqlite3_stmt      *stmt, 这个相当于ODBC的Command对象,用于保存编译好的SQL语句
sqlite3_column_text(), 取text类型的数据。
sqlite3_column_blob(),取blob类型的数据
sqlite3_column_int(), 取int类型的数据```

#####3)SQLite语句

*1.打开数据库 SQLITE_API int SQLITE_STDCALL sqlite3_open( const char filename, / 数据库文件路径 (UTF-8) */ sqlite3 *ppDb / 数据库句炳(象征) */ );

*2.执行任何SQL语句 (除了查询语句) SQLITE_API int SQLITE_STDCALL sqlite3_exec( sqlite3*, /* 一个打开的数据库实例 / const char sql, / 需要执行的SQL语句 / int (callback)(void,int,char,char**), /* SQL语句执行完毕后的回调 */ void , / 回调函数的第1个参数 */ char *errmsg / 错误信息(用来调试) */

*3.检查SQL语句的合法性(查询前的准备) SQLITE_API int SQLITE_STDCALL sqlite3_prepare_v2( sqlite3 db, / 数据库实例 */ const char zSql, / 需要检查的SQL语句, UTF-8 encoded / int nByte, / SQL语句的最大字节长度 */ sqlite3_stmt *ppStmt, / OUT: sqlite3_stmt实例,用来获得数据库数据 */ const char *pzTail / OUT: 指向 sql 语句中未使用的部分 */ );

*4.查询一行数据 int sqlite3_step(sqlite3_stmt*); // 如果查询到一行数据,就会返回SQLITE_ROW``

*5.利用stmt获得某一字段的值(字段的下标从0开始) double sqlite3_column_double(sqlite3_stmt*, int iCol);  // 浮点数据 const unsigned char sqlite3_column_text(sqlite3_stmt, int iCol);  // 字符串数据 int sqlite3_column_int(sqlite3_stmt*, int iCol); // 整型数据 sqlite3_int64 sqlite3_column_int64(sqlite3_stmt*, int iCol); // 长整型数据 const void sqlite3_column_blob(sqlite3_stmt, int iCol); // 二进制文本数据


###六、基本操作
导入libsqlite3.tbd
![libsqlite3-1.png](http://upload-images.jianshu.io/upload_images/2330091-502d2836f666efa8.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
![libsqlite3-2.png](http://upload-images.jianshu.io/upload_images/2330091-6d172e6243fcdc2a.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

####1.创建表  (create)

格式 create table 表名; create table if not exists 表名 ; 示例 create table t_zorn; create table if not exists t_zorn;


####2.插入数据(insert)

格式 insert into 表名 (字段1, 字段2, …) values (字段1的值, 字段2的值, …) ;  示例 insert into t_student (name, number) values ('zorn', 123567) ;  注意 数据库中的字符串内容应该用单引号 ' 括住


####3.删表(drop)

格式 drop table 表名 ; drop table if exists 表名 ; 示例 drop table t_zorn; drop table if exists t_zorn ; 注意 上面的示例会将t_zorn表中所有记录都删掉


####4.指定位置删除数据(delete)

格式 delete from 表名 where 字段1 = 1 ; 示例 delete from t_zorn where id = 1 ;

####5.查询数据(select)

格式 select 字段1, 字段2, … from 表名 ; select * from 表名;   //  查询所有的字段 示例 select name, age from t_zorn ; select * from t_zorn ; select * from t_zorn where number > 110 ;  //  条件查询 ```

####6.更改数据(update)

格式
update 表名 set 字段1 = 字段1的值, 字段2 = 字段2的值, … ; 
示例
update t_zorn set name = 'ren', numer = 112 ; 
注意
上面的示例会将t_zorn表中所有记录的name都改为ren,number都改为112 [可添加where(相当于if)做判断]

###总结: ####SELECT的其它用法

*select还可以起别名(适用于字段和表)
格式
select 字段1 别名 , 字段2 别名 , … from 表名 别名 ; 
select 字段1 别名, 字段2 as 别名, … from 表名 as 别名 ;
select 别名.字段1, 别名.字段2, … from 表名 别名 ;
示例
select name myname, number mynumber from t_zorn  t_Ren;
给name起个叫做myname的别名,给number起个叫做mynumber的别名,给t_zorn起个叫做t_Ren的别名
select w.name, w.number from t_student s ;
给t_zorn表起个别名叫做w,利用s来引用表中的字段

*select计算记录的数量
格式
select count (字段) from 表名 ;
select count ( * ) from 表名 ;
示例
select count (number) from t_zron ;
select count ( * ) from t_zorn where number = 110;

*select排序
查询出来的结果可以用order by进行排序
select * from t_zorn order by 字段 ;
select * from t_zorn order by age ;
默认是按照升序排序(由小到大),也可以变为降序(由大到小)
select * from t_zorn order by age desc ;  //降序
select * from t_zorn order by age asc ;   // 升序(默认)
也可以用多个字段进行排序
select * from t_zorn order by age asc, height desc ;
先按照年龄排序(升序),年龄相等就按照身高排序(降序)```
### 附上SQLite管理工具下载地址(仅供参考):
![SQLite Professional](http://upload-images.jianshu.io/upload_images/2330091-77fb35aeab2dd571.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
->[SQLite管理工具下载](http://www.cr173.com/mac/123368.html  )
#实战:
   -> [SQLite3Demo](https://github.com/ZornHuang/SQLite3)

![运行时的主界面](http://upload-images.jianshu.io/upload_images/2330091-b145d01ab3840d6c.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)