数据库的存储以表为单位
- 表由多个字段(列, 属性,行)组成
- 表里面的每一行数据成为"记录"
- iOS中使用数据库之前要先添加库文件(libsqlite3.tbd), 负责会报错
- 添加头文件: #import<sqlite3.h>
想要在程序运行过程中操作数据库中的数据, 就要使用SQL语句增删改查(CRUD),SQL语句的特点:
- 不区分大小写.
- 每条语句都以;号结尾
- 不能使用关键字来命名表,字段
-
除过查询以外的所有操作都成为更新
-
create 和 drop针对于创表和删表 - 针对于表
- insert,update,delete - 针对于表中的数据
- select 用户查询表中的数据
- 实际上sqlite是无类型的,所谓的类型, 是给我们自己看的
基本语句
CREATE TABLE if not EXISTS t_student (id integer, name text, age integer);
INSERT into t_student (id, name, age) VALUES (1, 'pj', 20);
UPDATE t_student set name = 20, id = 10;
DELETE from t_student
条件语句
update t_student set age = 20 where id = 10;
delete from t_student WHERE id = 100;
update t_student set id = age WHERE id = 9; //把id为9的字段的年龄赋值给id.
/ 数据查询 /
SELECT id, name, age from t_student;
SELECT * from t_student where age < 30;
SELECT id stu_id, name, age from t_student; // id stu_id和id as stu_id 是一样的, 中间的as可以省略
SELECT * from t_student stu WHERE stu.age < 25;//起别名 在多张表中用的比较多
SELECT count(*) FROM t_student where age < 35; // 显示消息的个数
SELECT * from t_student ORDER by age asc // 升序(默认) desc 降序
SELECT * from t_student where age < 24 order by age asc, id desc; // 显示年龄小于24的所有信息, 这些信息 按照年龄的升序排列, 年龄一样的情况下按照id的降序排列
SELECT * from t_student limit 10, 20; //跳过前面的10条记录, 取20条
SELECT * from t_student limit 0, 10; //取最前面的10条
SELECT * from t_student limit 7; //取最前面的7条
CREATE TABLE IF not EXISTS s_tu(id integer unique, name text not null, age integer default 20);// id必须唯一, name不能为空, 年龄默认为20 CREATE TABLE IF not EXISTS s_tu(id integer primary key autoincrement, name text);// 申明主键 INSERT into t_stu (id, name, age) VALUES (1, 'ww', 30);
主键约束
- 每张表都有一个唯一的主键, 用来标识记录的唯一性,
- 主键可以是一个字段或者多个字段
/* * 设计一个班级和学生的信息的数据库 * 设计2张表: t_class, t_student * t_class: id, name, open_time * t_student: id, name * 设置表(t_class和t_student)的关联 在t_student中扩展字段 class_id(外键) /
CREATE TABLE if not EXISTS t_class(id integer primary key autoincrement, name text not null unique);
// constraint fk_student_class foreign key class_id references t_class(id); // 生成一个约束, 约束的名称叫fk_student_class, 这个约束是一个外键约束, 我的外键约束class_id引用着t_class中的id // 添加了外键约束之后, class_id 的值 只能从 t_class中的id字段 CREATE TABLE if not EXISTS t_student(id integer primary key autoincrement, name text not null unique, class_id integer, constraint fk_student_class foreign key class_id references t_class(id);
SELECT * FROM t_food WHERE food_type_id = (SELECT id FROM t_foot_type where name = '粤菜') // 子查询
SELECT * FROM t_food food, t_food_type food_type where food.food_type_id = food_type.id and food_type.name = '粤菜';//联合查询 SELECT food.name, food_type.name FROM t_food food, t_food_type food_type where food.food_type_id = food_type.id and food_type.name = '粤菜';
FMDB
FMDB是IOS平台的SQLite数据库框架
FMDB是以OC的方式封装了SQLite的C语言API
FMDB提供了多线程安全的数据库操作方法,有效的防止了数据混乱
FMDatabase:代表一个数据库对象
FMResultSet:代码一个语句执行完成的结果集
FMDatabaseQueue:如果你在多个线程执行一个查询或更新语句, 那就要使用这个, 因为他是线程安全的
事务
事务的处理有三种:1. 开始, 结束, 回滚三种. beginTransaction 开启事务. commit 提交事务, rollback 回滚.
block 事务, 一句话搞定 beginTransaction rollback commit [queue inTransaction:^(FMDatabase db,BOOL rollback) {
}];
1. 批量更新数据: 节省时间, 提高效率
- 数据处理完之后, 一次性操作数据库. 如果不使用事务, 每一条数据都操作一次数据库. 比如: A工厂给我们公司加工2000套工作服
- 不使用事务, 生产一套, 给我们送过来再生产第二套.
- 使用事务, 2000套生产完之后, 一次性送过来.
1. 数据安全:回滚
- 比如买书操作. 我们刷卡, 机器扣费, 操作数据库. 这个过程中任意一个环节出错, 均视为操作失败. 这个时候我们要手动调用rollback进行回滚. 回滚之后数据库里面就没有我们这次<刷卡, 机器扣费, 操作数据库这个操作了>.
详见https://github.com/zhoupengju/PJSQLite