SQLite:嵌入式(终端产品)数据库(Database)
是按照数据结构来组合/存储和管理数据的仓库
关系型数据库(主流)和对象型数据库
常用的关系型数据库:
PC端:Oracle/MySQL Server/Access/
嵌入式/移动端:SQLite
3数据库的存储结构和excel很像,都是以表为单位的
数据库存储数据的步骤:
新建表(table)
添加多个表字段(column,列属性)
添加多行记录:每行存放多个字段对应的值
使用界面软件navicat lite创建对应的数据库: 建表 type: blob二进制 real浮点数 integer数字 text字符串
4在程序运行过程中操作数据库中的数据
SQL(structured query language)结构化查询语言
SQL是对关系型数据库中的数据进行定义和操作的语言,增删改查(CRUD)
SQL语句特点:
不区分大小写;每行以分号结尾;不可以使用关键字命名表和字段
常用的关键字:select/insert/update/delete/from/creat/where/desc/order/by/group/table/alter/view/index
数据库字段类型: 就算声明为integer类型,还是能存储字符串文本(主键除外)create tablet_student(name, age); 建表时声明啥类型或者不声明类型都可以,也就意味着创表语句可以这么
5 SQL语句种类:
数据定义语句(DDL:DataDefinitionLanguage)
包括create和drop等操作
在数据库中创建新表或删除表(createtable或droptable)
create table "t_product"("pid" integer,"pName" text,"pPrice" real)
create table if not exists "t_product"("pid" integer,"pName" text,"pPrice" real)
删除表结构和表内容 drop table "t_product"
drop table if exists "t_product"
数据操作语句(DML:Data Manipulation Language)
包括insert、update、delete等操作 和 条件语句
上面的3种操作分别用于添加、修改、删除表中的数据
插入数据:insert
insert into t_product ('pid','pName','pPrice')values(1001,'iphone',5888.0)
数据库中的字符串需要使用单引号 括住,避免使用转义(麻烦)
对整张表的所有字段进行插入的时候,可以少写字段名称
insert into t_product values (1002,'iphone',5888.0)
delete from t_product 没有指定哪行被删除
delete from t_product where pid = 1002
会将t_student 表中所有name 记录改为jack,age改为20
update t_student set name = 'jack',age = 20
update t_product set pName = 'android' where pid = 2222
数据查询语句(DQL:Data Query Language)
可以用于查询获得表中的数据
关键字select 是DQL(也是所有SQL)用得最多的操作
其他DQL常用的关键字有where,orderby,groupby和having
select * from 表名;//查询所有的字段
select name,score from t_student
select * from t_student where age > 10;条件查询
起别名:select name '名字' ,age'年龄' from t_student where score > 90 and age = 20;
select s.name, s.age fromt_students; 给t_student表起个别名叫做s,利用s来引用表中的字段
6聚集函数 求函数
起别名 select count[*] '总人数' from t_student
select count[age] from 表名; 字段的个数
select count [*] from 表名; 随便一个字段的个数
select count [*] from t_student where score >= 60;
最小值select min(score) from t_student max最大值
平局值select avg(score) from t_student
7排序
select * from t_student 获取所有
select * from t_student order by age desc;//降序
select * from t_student order by age asc;//升序 默认
多字段排序
select * from t_student orderby age asc,height desc;
先按照年龄排序(升序),年龄相等就按照身高排序(降序)
8limit
可以精确控制查询结果的数量,比如每次只查询 10条数据
格式: select * from t_student limit 4,8
跳过前面四条,然后取8条记录
select * from t_student limit 7;
相当于select * from t_student limit 0,7;
表示取最前面的7条记录
9简单约束 建表时可以给特定的字段设置一些约束条件
not null:规定字段的值不能为null
punique:规定字段的值必须唯一
pdefault:指定字段的默认值
createtablet_student(idinteger, nametextnotnullunique,ageintegernotnulldefault1);
name字段不能为null,并且唯一
age字段不能为null,并且默认为1
10主键约束
如果t_student表中就name和age两个字段,而且有些记录的name和age字段的值都一样时,那么就没法区分这些数据,造成数据库的记录不唯一,这样就不方便管理数据
良好的数据库编程规范应该要保证每条记录的唯一性,为此,增加了主键约束
也就是说,每张表都必须有一个主键,用来标识记录的唯一性
主键(PrimaryKey,简称PK)用来唯一地标识某一条记录
例如t_student可以增加一个id字段作为主键,相当于人的身份证
主键设计原则:主键应当是对用户没有意义的
永远也不要更新主键
主键不应包含动态变化的数据
主键应当由计算机自动生成
外键约束:(FK)
字段的取值是另一张表的主键取值的范围
11多表查询:需要联合多张表才能查到想要的数据 , 字段的取值是另一张表的主键的取值范围
实现查找jack是哪个班级的
嵌套查询 把一个查询的结果作为另一个查询的条件
select cName from t_class where cid = (select classID from t_student where name = 'jack')
select classID from t_student where name = 'jack'
搜索所有的搭配结果 自然连接:把表所有的数据笛卡尔积 然后添加条件取出冗余或者错误的行
select * from t_student , t_class where classID = cid and name = 'jack';
select (cName) from t_student , t_class where classID = cid and name = 'jack';
12
开发中的使用:
创建数据库的工具类
步骤一:创建并打开数据库
--------------------------------------------------------------------------------------
1 FMDB:是对SQLite3的封装,这里FMDB引入了一个MFDatabase对象来表示数据库,打开数据库和后面的数据库操作全部依赖此对象。
2 在FMDB中FMDatabase类提供了两个方法executeUpdate:和executeQuery:分别用于执行无返回结果的查询和有返回结果的查询。当然这两个方法有很多的重载这里就不详细解释了。唯一需要指出的是,如果调用有格式化参数的sql语句时,格式化符号使用“?”而不是“%@”、等
3 直接使用libsqlite3进行数据库操作其实是线程不安全的,如果遇到多个线程同时操作一个表的时候可能会发生意想不到的结果。为了解决这个问题建议在多线程中使用FMDatabaseQueue对象,相比FMDatabase而言,它是线程安全的
4 将事务放到FMDB中去说并不是因为只有FMDB才支持事务,而是因为FMDB将其封装成了几个方法来调用,不用自己写对应的sql而已。其实在在使用libsqlite3操作数据库时也是原生支持事务的(因为这里的事务是基于数据库的,FMDB还是使用的SQLite数据库),只要在执行sql语句前加上“begin transaction;”执行完之后执行“commit transaction;”或者“rollback transaction;”进行提交或回滚即可。另外在Core Data中大家也可以发现,所有的增、删、改操作之后必须调用上下文的保存方法,其实本身就提供了事务的支持,只要不调用保存方法,之前所有的操作是不会提交的。在FMDB中FMDatabase有beginTransaction、commit、rollback三个方法进行开启事务、提交事务和回滚事务。
未完待续。。。
网友评论