一  数据库管理系统
二 SQL 语句
三 iOS 的数据库技术实现
 
/**
 iOS 的数据持久化方式
 1 属性列表(plist 文件),Preferences(偏好设置,通过単例)
 2 归档(类名 NSKeyedArchiver)
 3 数据库 (SQLite、CoreData、FMDB(第三方))
 
之前的所有存储方法,都是覆盖存储。如果想要增加一条数据就必须把整个文件读出来,然后修改数据后再把整个内容覆盖写入文件。所以它们都不适合存储大量的内容。
 */
 
一  数据库管理系统
1  什么是数据库:
数据库(Database):  是按照数据结构来组织、存储和管理的仓库
 
2 数据库特征
 以一定方式储存在一起;能为多个用户共享;具有尽可能小得冗余度;与程序彼此独立的数据集合。
 
3  常见的数据库:SQL,My SQL,Oracle
 
4 数据库分类
 1 关系型数据库(主流):关系型数据库是以行和列的形式存储数据,这种形式被称为表(二维表格),组成数据库。
 1.1 关系 : 可以理解为一张二维表,每一个关系都有一个关系名,也就是表名
 1.2 属性 : 可以理解为二维表中的一列,在数据库中称为字段。
 1.3 元组 : 可以理解为二维表中的一行,在数据库中称为记录
 1.4 域 : 属性的取值范围,也就是数据库中,某一列的取值范围
 1.5 关键字 : 一组可以唯一标识元组的属性。数据库中称为主键。可以由一个或者多个列组成
 1.6  常用关系型数据库 :
     PC端:Oracle、MySQL、SQL Server、Access、DB2、Sybase
     嵌入式\移动客户端 : SQLite
 
 2 对象型数据库 : 把面向 对象的方法和数据库技术结合起来,使得数据库系统的分析,设计尽最大程度的和人的思想,以及对世界的认识保持一致
 
3  层次式数据库
 
4 比较 : 因为这些数据库所占用的系统资源太多,所以在iOS开法中不使用这些数据库,iOS开发中使用轻量级的嵌入式数据库sqlite。 
     支持事件,不需要配置,不需要安装,不需要管理员;
     支持大部分SQL92;完整的数据库保存在磁盘上面一个文件,同一个数据库文件可以在不同机器上面使用,最大支持数据库到2T;
     整个系统少于3万行代码,少于250KB的内存占用;源代码开发,代码95%有较好的注释,简单易用的API。
 
5 为什么要用 SQLite 数据库?
1 是一款轻量级的嵌入式数据库(用于移动端)
2 处理数据的数据,比MySql还要快
3 SQLite 不需要进行配置,这就意味不需要进行安装和管理
4 它是一个不需要单独服务器进行操作的系统
5 SQLite 是非常小的,完全配置时小于 400k ,当省略一些可选文件时,小于250k
6 SQLite 是自给自足的,也就意味着不需要任何的外部依赖
 
 
6 SQLite 是如何存储的?
  和 excel 很像,是以表(tabel)为单位进行存储
 
7 数据库的存储步骤
 1 新建一张表(table
 2 添加多个字段(列、属性、column
 3 增加多条记录(record、row:用于存放多个字段的对应值)
 
 
二 SQL 语句
1 SQL语言概述
SQL : SQL 是 Structured Query Language (结构化查询语言)的缩写。SQL是专为数据库而建立的操作命令集,是一种齐全的数据库的语言。
补充 : 是一种关系型数据库,对数据进行定义和操作(增,删,改,查)的语言
 
2 什么是 SQL语句
 1 用 SQL 语言编写的句子,代码
 2 在运行程序过程中,要操作(增删改查 : CRUD)数据库中的数据,必须使用SQL 语句
  3 SQL 语句的特点
 1 不区分大小写(例如 在数据库中 user 和 USer 是一样的)
 注意 每条语句必须用分号“ ; ”结束,不能用关键字来命名表、字段。
 
 2 数据库中常用的关键字
 select 、 insert 、 update 、 delete 、 where 等等
  4 SQL 语句的种类
 1 数据定义语句(DDL:Data Definition language):用来定义表的结构,包括 create tabel(建表),drop tabel(删表)等操作
 2 数据操作语句(DML : Data Manipulate language):用来修改表内容,包括 insert 、 delete 、 update
 3 数据查询语句(DQL: Data Query language):用来查询表内数据,关键字是 select (也是DQL中和所有SQL中用的最多的操作
 
SQL语句关键字和格式
create table if not exists 表名(字段1 约束列表,字段2 约束列表 。。。);
 insert into 表名(字段列表)values(字段值列表);
update(表名)set 字段名1 = 修改值1,字段名2 = 修改值2,...where条件
where 条件关键字   多个条件用 and 连接
delete from 表名 where 条件 (可以删表,增加条件可以删其他(如主键))
select 要查找字段 from 表明 where 条件
drop table (删表)
 
5 SQLite 数据库数据类型
5.1 SQLite 是无类型的数据库,可以保存任何类型的数据,对于SQLite来说对字段不指定任何类型是完全有效的
注: 良好的编程习惯应该要为字段标注类型
5.2 SQLite 近似类型规则
原因: 为了使 sqlite 和其他数据间的兼容性最大化,sqlite 支持“类型近似” 的观点,列的类型近似指的是存储在列上数据的推荐类型 :
SQLite 存储类 
INTEGER : 值是一个带符号的整数,根据值得大小存储在 1、2、3、4、6或8 字节中
TEXT:值是一个文本字符串,使用数据库编码(UTF-8、UTF-16BE或UTF-16LE)存储
NULL:值是一个 NULL 值
REAL:值是一个浮点值,存储为8字节的IEEE浮点数字
BLOB : 值是一个blob 数据,完全根据他的输入存储
SQLite Affinity 类型
SQLite 支持列上的类型 affinity 概念。任何列仍然可以存储任何类型的数据,但列的首选存储类是它的 affinity。在 SQLite3 数据库中,每个表的列分配为以下类型的 affinity 之一:
TEXT 该列使用存储类 NULL、TEXT 或BLOB 存储的所有数据
NUMERIC 该列可以包含使用五个存储类的值
INTEGER : 值是一个带符号的整数,根据值得大小存储在 1、2、3、4、6或8 字节中
REAL:值是一个浮点值,存储为8字节的IEEE浮点数字  (强制把整数转换为浮点值)
NONE :带有 affinity NONE 的列,不会优先使用哪个存储类,也不会尝试把数据从一个存储类强制转换为另一个存储类
 

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 算起的秒数。
 
您可以以任何上述格式来存储日期和时间,并且可以使用内置的日期和时间函数来自由转换不同格式。
 
6 SQLite 字段约束条件
NOT NULL - 非空      
UNIQUE - 唯一
PRIMARY KEY - 主键
FOREIGN KEY - 外键
CHECK - 条件检查,确保一列中的所有值满足一定条件
DEFAULT - 默认
AUTOINCREMENT - 自增型变量
 
PRIMARY KEY - 主键
1主键具有唯一性,是每一条记录的身份证。
2 主键一般也是一个索引,通过主键查找记录速度与较快。
3 在关系型数据库中,一个表的主键可以作为另外一个表的外键,这样,这两个表之间就可以通过外键建立关系。
4 主键一般是整数或者字符串。如果是整数,该列的值可以自动增长。
 
 
 
 
三 iOS 的数据库技术实现
1 SQLite 的使用
Linux 系统级的 SQLite 技术实现框架
Xcode 6 中 libsqlite3.0.dylib
Xcode 7 中 libsqlite3.0.tbd
步骤:
1 引入 <sqlite3.h>头文件
2 打开数据库
3 执行SQL命令
4 关闭数据库
 
2 SQLite 常用系列函数
1  执行sql语句 :sqlite3_exec()可以执行任何SQL语句,比如创表,更新,插入和删除操作.但是一般不用于它执行查询语句,因为它不会返回查询到的数据
预执行:sqlite3_prepare( ) 这个函数将sql文本转换成一个准备语句(prepared statement)对象,同时返回这个对象的指针.他实际上并不执行(evaluate)这个SQL语句,他仅仅为执行准备这个sql语句.
sqlite3_bind_( ) 给宿主参数(host parameters) 绑定值( 代表不同类型)
 
4 sqlite3_step ( ) 一次或多次来执行前面sqlite3_prepare 创建的准备语句,意思是预执行之后可以找到一个或者多个结果,如果sqlite3_step(stmt) == SQLITE_ROW说明结果还有下一行,那么先记录一行的数据取出来 在接着走着取一行数据

5 sqlite3_column( ) 这个过程从执行 sqlite3_step( ) 执行一个准备语句得到的结果集的当前行中返回一个列. 每次 sqlite3_step 得到一个结果集的列停下后,这个过程就可以被多次调用去查询这个行的各列的值. 对列操作是有多个函数,均以sqlite3_column为前缀

sqlite3_finalize( ) 这个过程销毁前面被 sqlite3_prepare 数据库创建的准备语句,每个准备语句都必须使用这个函数去销毁以防止内存泄露