数据库
数据库:
数据存储的方式
-
Plist (NSArry NSDictionary),只能存储数组,字典,但是数组和字典里面不能有自定义对象
-
偏好设置:也不能存储自定义对象
-
归档:存储自定义对象,局限:一次性做读取存储操作。
-
sqlite数据库:操作数据比较快,读取比较方便,可以局部的读取,比较小型,占用的内存资源比较小。
什么是sqlite?一款轻型的嵌入式数据库,它占用资源非常低,在嵌入式设备中 ,可能只需要几百k就够了,它的处理速度比Mysql,PostgreSQL这两款著名数据库都还快。
操作数据库的步骤:
-
创建数据库表,表名,通常以t_ 如:t_student
-
设计表的字段,看下表需要存储什么数据,就添加什么什么样的字段 字段如:name age id(唯一标志符,要求自动增长)等。
-
记录数据
SQL语句:使用SQL语言编写的程序或者代码
SQL中的常用关键字有:select,insert,update,from,create,where,order by,group,table,view,index,desc(降序),asc(升序),等。
特点:不区分大小写,每条语句都必须以分号结尾,数据库中不可以使用关键字做表名和字段
数据库(SQL)语句的种类
数据定义语句(DDL:Data Definition Language)
包括create和drop等操作,在数据库中创建新表格(create table)和删除表格(drop table).
数据操作语句(DML:Data Manipulation Language)
包括insert,update(更新,修正,校正),delete等操作,上面三种操作分别用于添加,修改,删除表格中的数据
数据查询语句(DQL:Data Query Language)
可用于查询表格中的数据。关键字select是DQL(也是所有SQL)用的做多的操作,其他DQL常用关键字where,order by,group by和having
DDL:数据定义语句
创表:
格式:create table 表名 (字段1 字段类型1,字段2 字段类型2,…);
create table if not exists 表名(字段1 字段类型1,字段2 字段类型2,…);
示例:create table if not exists t_student (id integer primary key autoincrement,name text,age integer,score real);
字段类型:SQLite将数据划分为几种存储类型integer:整形值,real:浮点型值,text:文本字符串,blob:二进制数据(比如文件)
实际上SQLite是无类型的,计算声明为integer类型,还是能存储字符串类型文本(主键除外),建表时声明啥类型或者不声明类型都可以,也就意味着创建表语句也可以这么写:create table t_student (name,age);当然为了保持良好的编程规范,方便程序员之间的交流,编写建表语句的时候最好加上每个字段的具体类型。
删表:
格式:drop table 表名;
drop table if exists 表名;
示例:drop table if exists t_student;
DML:数据操作语句
插入数据:
格式:insert into 表名 (字段1,字段2,…)values(字段1的值,字段2的值,…);
示例:insert into t_student(name,age)values(‘mj’,10);
注意:数据库中的字符串内容应该用单引号括住。
更新数据:
格式:update表名set字段1=字段1的值,字段2=字段2的值,…;
示例:update t_student set name = ‘jack’,age = 20;
注意:上面的示例会将t_student表中所有记录的name都改为jack,age改为20。
删除数据:
格式:delete from 表名;
示例:delete from t_student;
注意:上面的示例会将t_student表中的所有记录删除。只是删除记录,表不会删除掉
条件语句:
如果只想更新或者删除某些固定的记录,那就必须在DML语句后加上一些条件
条件语句常见的格式
where 字段 = 某个值;//不能用两个=
where 子段is某个值;is相当于=
where 子段!=某个值;
where 子段is not某个值;//is not 相当于!=
where 子段>某个值;
where 子段1=某个值and字段2>某个值;and相当于c语言中的&&
where 子段1=某个值or字段2=某个值;//or相当于c语言中的||
示例:update t_student set name = ‘jason’ where id = 1;
delete from t_student where name = ‘jack’;
DQL:数据查询语句
格式
Select 字段1,字段2,...from表名;
select*from表名;//查询所有字段
示例:select name,age from t_student;
select*from t_student;
select*from t_student where age>10;//条件查询
排序
按照某个字段的值,进行排序搜索
select*from t_student order by 字段;
select*from t_student order by age;
默认排序是按照升序排序(从小到大),也可以变为降序(由大到小)
Select*from t_student order by age desc;//降序
Select*from t_student order by age asc;//升序(默认)
也可以用多个字段进行排序
Select*from t_student order by age asc,height desc;//先按照年龄升序排序,年龄相等就按照身高排序(降序)
Limit
使用limit可以精确地控制查询结果的数量,比如每次只查询10条数据
格式
Select*from表名limit数值1,数值2;
示例
Select*from t_student limit 4, 8;//可以理解为:跳过最前面4条语句,然后取8条记录。
猜猜下面语句的作用
Select*from t_student limit 7;
相当于select*from t_student limit 0,7;//表示最前面的7条记录。
简单约束
建表时可以给特定的字段设置一些约束条件,常见的约束有:
not null:规定字段的值不能为null
unique:规定字段的值必须唯一
default:指定字段的默认值
(建议:尽量给字段设定严格的约束,以保证数据的规范性)
示例
create table t_student (id integer,name text not null unique,age integer not null default 1);
name字段不能为null,并且唯一
age字段不能为null,并且默认为1
主键约束
如果t_student表中就name和age两个字段,而且有些记录的name和age字段的值都一样时,那么就没法区分这些数据,造成数据的记录不唯一,这样就不方便管理数据
良好的数据库编程规范应该要保证每条记录的唯一性,为此,增加了主键的约束,也就是说,每张表都必须有一个主键,用来标识记录的唯一性
什么是主键
主键(primary key ,简称PK)用来唯一地标识某一条记录
例如t_student可以增加一个id字段作为主键,相当于人的身份证,主键可以是一个字段或多个字段。
外键的约束
利用外键的约束可以用来建立表与表之间的联系
外键的一半情况是:一张表的某个字段,引用着另一张表的主键字段
新建一个外键
Create table if not exists t_student (id integer primary key autoincrement,name text,age integer,class_id integer,constraint fk_student_class foreign key (class_id)references t_class(id) );
t_student 表中有一个叫做fk_t_student_class_id_t_class_id 的外键,这个外键的作用是用t_student表中的class_id字段引用t_class表的id字段
表链接
什么是表链接查询
需要联合多张表才能查到想要的数据
表链接的类型
内链接:inner join 或者join(显示的是左右表都有完整字段值得记录)
左外链接:left outer join (保证左表数据的完整性)
示例:查询1020班的所有学生
Select s.name,s.age from t_student s,t_class c where s.class_id=c.id and c.name = ‘1020’;
数据库的简单实用
之前都是保存到document,最近保存到document,苹果不允许上传。
游戏一般是document
//获取cache文件夹路径
NSString*cachePath = NSSearchPathForDirectoriesInDomains(NSCachesDirectory,NSUserDomainMask,YES)[0];
//拼接文件名
NSString*filePath = [cachePath stringByAppendingString:@”student.sqlite”];
//打开数据库,就会创建数据库文件
//fileName保存数据库的全路径文件名
//ppDb:数据库实例
sqlite3*db = nil;
If(sqlite3_open(filePath.UTF8String,&db) == SQLITE_OK){
NSLog(@”数据库打开成功”);
}else{
NSLog(@”数据库打开失败”);
}
//创建表
//第一个参数:数据库实例,第二个参数:执行的数据库语句
//char **errmsg:提示错误
NSString *sql = @”create table if not exists t_student (id integer primary key autoincrement ,name text,age inteager) ;”;
Char *errmsg;
//执行创表语句
Sqlite3_exec(db , sql.UTF8String,NULL,NULL,&errmsg);
If (errmsg){
NSLog(@”创建表失败”);
NSLog(@”创建表失败”);
}else{
NSLog(@”创建表失败”);}
}