SQLite数据库
1.数据库简介
1.1数据库的作用:"离线缓存数据"
1.2数据缓存策略
plist
归档
偏好设置
沙盒文件
"SQLite数据库"
1.3系统提供的数据存储方式的弊端:
不方便操作大量的数据
-系统提供的数据存储方式都是覆盖存储的,新的数据会覆盖旧的数据.而且当数据量非常大时,如果要添加新的数据,必须先把旧数据全部加载到内存中
不方便查找大量的数据
-当数据量非常庞大时,要查询其中某些数据,就非常困难
代码演示plist文件保存数据
1.4SQLite简介
SQLite是一个轻量级,体积小,嵌入式,功能强大,跨平台的数据存储方式
客户端的数据库: SQLite
服务器端的数据库: MySQL --> SQLServer --> Oracle
1.5学习方式
先用Navicat客户端演示SQLite的使用(仅仅是上课演示而已,不需要掌握)
再用代码演示SQLite的使用(需要熟练使用)
2.Excel存储数据
2.1提示: SQLite数据库存储数据的结构和Excel很像
"Excel""SQLite"
-创建Excel文件-创建一个数据库文件
-创建表-创建表
-确定表头-创建数据库的字段名(Excel表头),并指定数据类型
-对Excel表进行数据操作-对数据库进行增删改查
2.2一个数据库中,可以有多张表,每个表中可以存储不同的数据
3.Navicat存储数据-创建数据库和表
3.1提示:数据库本身就是一个文件,可以用终端和客户端来创建和操作
3.2Navicat创建数据库和表的步骤:
1.创建一个数据库文件,以".sqlite"结尾
2.建立Navicat和数据库文件的连接,只有建立好连接才能操作数据库文件
3.创建数据库表,创建表头并指定数据类型
4.保存数据库文件,以"t_xxx"命名
4.Navicat操作数据-增删改查
4.1在数据库中
行:记录/数据(一条记录/一条数据)
列:字段名/列名
4.2增删改查操作
新增:'+'
删除:'-'
修改:双击字段直接修改
查询:'filter'(过滤)
4.3以上操作都是在Navicat客户端操作的,实际开发中是在Xcode中写代码.
5.SQL语句之数据定义语句-创建和删除表
iOS OC
Android JAVA
SQLite数据库"SQL语句"
5.1SQL语句:一个通用的数据库语言,适用于客户端数据库(SQLite)和服务器端数据库(MySQL,SQLServer,Oracle)
5.2客户端的SQL语句需要掌握:"数据定义语句","数据操作语句","条件语句","数据查询语句"
5.3数据定义语句:创建(create)和删除(drop)数据库表
-创建数据库表:
create tableifnot exists表名(字段名1类型,字段名2类型,...);
"create table if not exists t_product(productID integer,productName text,productPrice integer);"
-删除数据库表
drop tableifexists表名;
"drop table if exists t_product;"
6.SQL语句之数据操作语句-增删改
-提示:到目前为止数据库和数据库表都已经创建好了,现在开始就是操作数据库
6.1新增语句
insert into表名(字段名1,字段名2,...) values(字段1值,字段2值,...);
"insert into t_product(productID,productName,productPrice) values(1005,'iPhone103',2000);"
注意:字符串用'单引号'引起来
6.2删除语句
delete from表名where条件语句;
"delete from t_product where productPrice = 1000;"
注意:如果执行删除语句时不加条件语句,就会删除表中所有的记录
6.3修改语句
不加条件时,所有的productPrice字段的值都会修改成103
"update t_product set productPrice = 103;"
按照条件修改一个字段的值
"update t_product set productPrice = 333 where productID = 1005;"
按照条件,修改一条记录的多个字段
"update t_product set productName = 'iPHone1000',productPrice = 1000 where productID = 1002;"
7.SQL语句之查询语句(相当重要)
7.1准备工作:执行提前准备好的新增语句,准备要查询的数据
7.2查询语句体验
查询价格大于5500的商品信息
"select * from t_product where productPrice > 5500;"
查询价格小于4000或者价格大于5500的商品信息
"select * from t_product where productPrice < 4000 or productPrice > 5500;"
查询商品编号小于100并且价格小于4000的商品信息
"select * from t_product where productID < 100 and productPrice < 4000;"
注意:"select *"是查找表中的所有字段
8.排序和分页查找
8.1排序
提示:分页和排序都是在某个查询结果后面执行进行的
使用场景:电商类APP中的商品按照价格的从高到低筛选展示
查询出来的数据,按照价格从低到高排序
"select * from t_product where productID < 100 and productPrice < 4000 order by productPrice;"
查询出来的数据,按照价格从高到低排序
"select * from t_product where productID < 100 and productPrice < 4000 order by productPrice desc;"
注意:"order by"是默认从低到高;"desc"是从高到低
8.2分页查询
从第0条开始查询,查询五条记录
"select * from t_product where productID < 100 and productPrice < 4000 order by productPrice desc limit 0,5;"
"limit 0,5":分页语句;索引,每页条数.从第0条开始查询,每页查询五条记录
规律:
第1页: limit0,5
第2页: limit5,5
第3页: limit10,5
...
第n页: limit (n-1)*每页条数,每页条数
注意:
当取到最后,记录不足每页条数时,就取实际剩下的记录
分页语句放在查询语句的后面
9.模糊查询
9.1使用场景:关键字搜索
查找商品价格中带99的商品
"select * from t_product where productPrice like '%99%';"
查找商品价格中带99的商品,按照价格从高到低排序
"select * from t_product where productPrice like '%99%' order by productPrice desc;"
查找商品价格中带99的商品,按照价格从高到低排序,取前面五条
"select * from t_product where productPrice like '%99%' order by productPrice desc limit 0,5;"
10.主键字段
10.1提示:
当有两条记录是一样的时候,可以使用主键字段来区别
主键可以自增长,数据库建议我们每个表中都要有主键字段
10.2主键字段演练
增加字段(了解)
"alter table t_studentInfo add id_replace integer;"
新建表,并设置主键字段
"create table if not exists t_class(id integer primary key,className text not null,classNO integer);"
10.3注意:
"primary key":某某字段为主键
"not null":某某字段不能为空
11.Xcode之原生SQLite -创建数据库和表
11.1提示:导入头文件"#import ";新增类库"libsqlite3.0.tbd"
11.2使用步骤
1.创建数据库
2.打开数据库
3.建表(t_person)
4.操作表
11.3注意:
- sqlite3中的函数都是以sqlite3开头的
-创建并打开数据库函数: sqlite3_open
-建表和数据操作函数(查询函数除外) : sqlite3_exec
12.Xcode之原生SQLite -数据增删改查
-建表和数据操作函数(查询函数除外) : sqlite3_exec
-查询函数: sqlite3_prepare_v2
-查询数据时会得到结果集,要查询的数据都在结果集中,while循环遍历结果集一条一条记录取出来
13.FMDB -创建数据库和表
13.1FMDB简介
- FMDB是一个操作数据库的第三方框架,并且支持多线程环境下的操作
-也是需要手动导入'libsqlite3.0.tbd'库
-"FMDatabase":单线程;"FMDatabaseQueue":多线程;"FMResultSet":查询的结果集
13.2演练保存Heros模型数据
准备模型类和保存模型数据的工具类
13.3FMDB使用步骤:
1.创建数据库
2.打开数据库
3.创建表
4.增删改查
13.4注意:
-创建数据库和建表只需要执行一次,可以在"+ (void)initialize"方法中实现
-建表,增删改操作都是同一个方法"[_db executeUpdate]"
-查询是另外的方法"[_db executeQuery]"
15.FMDB增删改查
15.1新增操作
[_db executeUpdateWithFormat:@"insert into t_heros(name,age) values(%@,%@)",hero.name,hero.age];
15.2删除操作
[_db executeUpdateWithFormat:@"delete from t_heros where name = %@",hero.name];
15.3修改操作
[_db executeUpdateWithFormat:@"update t_heros set name = %@ where id = 3",hero.name];
15.4查询操作
-需求:把查询出来的数据展示在列表上
- UI准备:准备好列表
-数据准别
获取结果集: FMResultSet *resultSet = [_db executeQuery:@"select * from t_heros"];
while循环遍历结果集,把遍历出来的数据转成模型数据,并添加到模型数组
取结果集中的数据: NSString *name = [resultSet stringForColumn:@"name"];
16.FMDB模糊查找-关键字搜索
16.1注意:
1.大坑提示:模糊查询时,需要自己拼接查询语句,不要使用框架提供的
2.'%'是特殊字符,此时需要使用%转义.即'%%'
3.自己拼接查询语句时,就需要自己添加单引号把字符串引起来
16.2自己拼接模糊查询语句
-错误的拼接和执行模糊查询的方式
FMResultSet *resultSet = [_db executeQueryWithFormat:@"select * from t_heros where name like '%%%@%%'",keyWord];
-正确的拼接和执行模糊查询的方式
NSString *selectSQL = [NSString stringWithFormat:@"select * from t_heros where name like '%%%@%%'",keyWord];
FMResultSet *resultSet = [_db executeQuery:selectSQL];
17.多线程操作数据库的问题及解决办法
-问题:当有多个线程同时操作一个数据库时,只有一个数据会写入.
-解决办法:让FMDatabaseQueue(串行队列)来管理数据库对象.多个操作按顺序来进行
18.封装FMDataBaseQueue单例
新建单例类,继承自FMDataBaseQueue,保证只创建一次
把FMDatabaseQueue定义成单例的目的是为了保证队列在内存中是唯一的一个,当有多个数据库操作任务时,都可以放在同一个队列中