数据库(SQLite)
01-数据库简介
1.什么是数据库
- 数据库(Database)是按照数据结构来组织,存储和管理数据的仓库
2.数据库的分类
- 关系型数据库(主流)
- PC端:Oracle/MySQL/SQL Server/Access/DB2/Sybase
- 嵌入式/移动端:SQLite
- 对象型数据库
3.iOS中数据存储的方式
- plist(NSArray/NSDictionary)
- 特点:只能存储系统自带的数据类型,比如NSDictionary/NSArray等等.自定义的对象无法存储.
- preference(偏好设置/NSUserDefaults)
- 特点:本质就是一个plist文件,也是只能存储系统自带的数据类型,自定义的对象无法存储
- NSCoding(NSKeyedArchiver/NSKeyedUnarchiver)
- 特点:可以存储自己定义的数据类型,但是都是一次性的全数据操作
- SQLite3
- 特点:存储一些大批量的数据,排序,统计等操作
- Core Data
- 特点:对SQLite3的一层面向对象的包装,本质还是要转换成为对应的SQL语句去执行
- 钥匙串
- APP之间数据共享
- 系统级别的加密,安全性高
- 当APP被删除时,存储的数据依然存在
4.什么是SQLite
- SQLite是一款轻型的嵌入式数据库
- 它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够了
- 它的处理速度比MySQL,PostgreSQL这两款注明的数据库都还快
5.如何存储数据到数据库
- 数据库库的存储结构和excel很像,以table为单位
- 数据库存储数据的步骤:
- 新建数据库文件
- 新建一张表table
- 添加多个字段(列,属性)
- 添加多行记录(每行存放多个字段对应的值)
6.通过Navicat操作数据库
- Navicat是一套适用于MySQL,SQLite等多个数据库系统的图形化数据库管理,报告以及监控的工具.
- 具有高性能的,商业智能的,强大的备份功能.
- 通过该软件可以创建/删除表,查询/删除/修改记录操作的SQL语句
- 表格组成:行(记录)和列(属性)
- 属性类型:
- blob:二进制类型
- integer:整型
- real:浮点型
- text:文本类型
- null:空
- 主键(Primary Key,PK):用来唯一的标识某一条记录
- 主键可以是一个字段或多个字段
- 主键的设计原则:
- 主键应当是对用户没有意义的
- 永远不要更新主键
- 主键不应包含动态变化的数据
- 主键应当由计算机自动生成
02-SQL语言简介
1.什么是SQL
- SQL(Structured Query Language):结构化查询语言
- SQL是一种对关系型数据库中的数据进行定义和操作的语言
- SQL语言简洁,语法简单,好学好用
- 使用SQL语言编写出来的句子/代码,就是SQL语句
- 在程序运行过程中,要想操作(CRUD)数据库中的数据,必须使用SQL语句
- C-Create,R-Retrive,U-Update,D-Delete
2.SQL语句的特点
- 不区分大小写
- 每条语句必须以分号结尾
3.SQL语句的常用关键字
- select,insert,update,delete,from,create,where,desc,order,by,group,table,alter,view,index等
4.SQL语句的种类
- 数据定义语句(DDL:Data Definition Language)
- 包括create,drop,alert等操作
- 在数据库中创建新表或删除表
- 数据操作语句(DML:Data Manipulation Language)
- 包括insert,update,delete等操作
- 上面3中操作分别用于添加,修改,删除表中的数据
- 数据查询语句(DQL:Data Query Language)
- 可以用于查询获得表中的数据
- 关键字select是DQL,也是所有SQL语句中用的最多的操作
- 其他DQL常用的关键字有where,order by,group by和having
5.DDL语句
- 创建表
- 格式:create table 表名 (字段名1 字段类型1,字段名2 字段类型2,...)
- 实际上SQLite是无类型的
- 就算声明为integer类型,还是能存储字符串文本(主键除外)
- 建表时声明什么类型或者不声明类型都可以,也就是意味着字段类型可以省略
- 为了保持良好的编程规范,方便程序员之间的交流,编写建表语句的时候最好加上每个字段的具体类型
- 语句优化:创建表格时,最好加个表格是否已经存在的判断,可以防止语句多次执行时发生错误.
- create table if not exists table_name
- 删除表
- 格式:drop table 表名;
- 优化:删除表格时,最好加个表格是否已经存在的判断,可以防止语句多次执行时发生错误
- drop table if exists table_name
- 修改表
- 注意:SQLite里面只能实现alter table的部分功能,不能删除一列,不能修改一个已经存在的列名
- 修改表名:alter table 旧表名 rename to 新表名
- 新增属性:alter table 表名 add column 列名 数据类型 限定符
6.约束
- 简单约束
- not null:字段的值不能为空
- unique:字段的值必须唯一
- default:指定字段的默认值
- 主键约束
- 作用:保证每条记录的唯一性,每张表必须有一个主键,用来标识记录的唯一性
- 主键可以使一个字段或多个字段
- 主键的声明:在创建表的时候用primary key声明主键
- 只要声明为primary key就说明是一个主键字段
- 主键字段默认就包含了not null和unique两个约束
- 如果想让主键自动增长(必须是integer类型),应该增加autoincrement
7.DML语句
- 插入数据(insert)
- insert into 表名 (字段1,字段2,...) values (字段1的值,字段2的值,...);
- 注意:数据库中字符串内容应该用单引号括住
- 更新数据(update)
- update 表名 set 字段1 = 字段1的值, 字段2 = 字段2的值, ...;
- 删除数据(delete)
- delete from 表名;
8.条件语句
- 作用:如果只想更新或者删除某些固定的记录,那就必须在DML语句后加上一些条件
9.DQL语句
10.查询相关语句
- 统计
- count(X)/avg(X)/sum(X)/max(X)/min(X)
- 排序
- 查询出来的结果可以用order by进行排序
- 默认是按照升序排列(由小到大),asc(升序)
- 也可以按照降序排列(由大到小),desc(降序)
- 也可以用多个字段进行排序:
- select * from t_student order by age asc, height desc;
- 先按照年龄排序(升序),年龄相等就按照身高排序(降序)
- 分页
- 使用limit可以精确地控制查询结果的数量,比如每次只查询10条数据
- 格式:select * from 表名 limit 数值1, 数值2;
- 示例:select * from t_student limit 4, 8;
- 可以理解为:跳过最前面4条记录,然后取8条记录
- limit通常来做分页查询,比如每页固定显示5条记录,那么第n页应该这样取:limit 5*(n-1), 5
- 特殊案例:
- select * from t_student limit 7;
- 相当于:select * from t_student limit 0, 7;
- 表示取最前面的7条记录
swift中使用sqlite3
导入sqlite3的动态链接库
- 由于SQLite3使用c语言实现,在swift中需要使用桥接
- 桥接时,随便创建一个oc的文件,然后删除创建的文件,保留桥接的.h文件
- 看是否桥接成功,就编译项目,然后敲代码sqlite3看是否有提示
数据库插入大批量数据的优化
- 使用预编译语句
- 手动开启和提交事务(最终解决方案)
- begin transaction
- commit transaction
- 事务:保证了操作的原子性,能够避免并发所带来的问题
- 在事务提交之前,不会修改数据库中的数据
- 如果事务提交成功才会修改数据库中的数据
- 如果回滚事务,则不会修改数据库中的任何数据