iOS中SQLite知识点总结1

数据库(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
  • 事务:保证了操作的原子性,能够避免并发所带来的问题
  • 在事务提交之前,不会修改数据库中的数据
  • 如果事务提交成功才会修改数据库中的数据
  • 如果回滚事务,则不会修改数据库中的任何数据
上一篇:xcode7,AFN不能使用的问题


下一篇:封装ajax方法