- 一、数据库管理系统
- 二、SQL语句
- 三、 iOS的数据库技术实现
数据库常用概念:
- SQL:SQL是Structured Query Language(结构化查询语言)的缩写。SQL是专为数据库而建立的操作命令集,是一种功能齐全的数据库语言。
- 数据库:是按照数据结构来组织、存储和管理数据的仓库。
- 数据库的分类:关系型数据库(主流)、对象型数据库、层次型数据库。
- 数据库的特征:1.以一定的方式存储在一起。2.能为多个用户共享。3.具有尽可能少的冗余代码。4.与程序彼此独立的数据集合。
- 常用的关系型数据库:PC端:Oracle、MySQL、SQL Server、Access、DB2、Sybase。嵌入式\移动客户端:SQLite
- 表:是数据库中一个非常重要的对象,是其他对象的基础。根据信息的分类情况,一个数据库中可能包含若干个数据表。
- 字段:表中的"列"成为"字段",每个字段包含某一专题的信息。(标识本列数据类型)
- 记录:是指对应于数据表中一行信息的一组完整的相关信息。
SQLite数据库数据类型:SQLite是无类型数据库,可以保存任何类型数据,对于SQLite来说 对字段不指定类型是完全有效的(注:良好的编程习惯应该要为字段标注类型)。为了使SQLite和其他数据库间的兼容性最大化,SQLite支持"类型近似"的观点,列的类型近似指的是存储在列上的数据的推荐类型。
SQLite近似类型规则:1.如果类型字符串中包含"INT",那么该字段的亲缘类型是INTEGER。2.如果类型字符串中包含"CHAR"、"CLOB"、"TEXT",那么该字段的亲缘类型是TEXT。3.如果类型字符串中包含"BLOB",那么该字段的亲缘类型是NONE。4.如果类型字符串中包含"REAL"、"FLOA"、"DOUB",那么该字段的亲缘类型是REAL。5.其他情况下,字段的亲缘类型是NUMERIC。
SQLite字段约束条件:
SQL语句:1.建表命令(create table)2.数据插入命令(insert)3.数据库更新命令(update)4.数据库删除命令(delete)5.数据库检索命令(select)
建表:create table if not exists 表名 (字段1 约束1 约束2······,字段2 约束1 约束2······,·····);
注:1.create table 建表关键字 2. if not exists 如果创建的表存在就不在创建 3.一个字段可以有多个约束。插入:insert into 表名(字段1,字段2,字段3,······)values(字段1值,字段2值,字段3值·····);
注:字段值要和前面的字段顺序一致更新:update 表名 set 字段名1 = 修改值1,字段名2 = 修改值2 ······ where 条件;
注:条件可以有一个或多个。多个条件使用and(与),or(或)连接。删除:delete from 表名 where 条件;
示例: delete from stu where age = 10;查询:select 要查找的字段 from 表名 where 条件;
注:要查找的字段(如果查找所有字段可以使用通配符*)
示例: select from stu where sex = '男'; select name , age , from stu where sex = '男';
iOS数据库技术的实现
Linux系统级的SQLite技术实现框架
Xcode6中 libsqlite3.0.dylib
Xcode7中 libsqlite3.0tdb
1.引入<sqlite3.h>头文件
2.打开数据库
3.执行SQL命令(建表,增删改查)
4.关闭数据库
建表 插入 更新等操作
//创建数据库文件的路径
- (NSString*)dbPath{
NSString* docPath = [[SandBoxPaths documentsPath] stringByAppendingPathComponent:@"testDB.sqlite"];
return docPath;
}
//创建数据库文件
- (void)createDB{
//创建数据库文件的函数,如果数据库文件存在,那么这个方法就是打开数据库文件,如果数据库文件不存在,这个方法就是先创建数据库文件,在打开数据库
//第一个参数是数据库文件的路径
//第二个参数:数据库文件的句柄取地址
//将数据库句柄指向数据库内存,我们对数据库的操作都是通过句柄来完成的
// dbPath.UTF8String是把NSString类型转换为C语言的 char* 类型
NSString* dbPath = [self dbPath];
int result = sqlite3_open(dbPath.UTF8String, &sqliteHandle);
if (result == SQLITE_OK) {
NSLog(@"数据库打开成功");
}else{
NSLog(@"数据库打开失败----%d",result);
}
}
//数据库的非查询操作(无返回结果集的操作),插入,更新,删除等操作
//参数为要执行的sql语句
- (void)noQueryOpertion:(NSString*)sql{
//用来执行无返回结果集的操作
//第一个参数:数据库句柄;所有对数据库的操作都是通过句柄来完成的
//第二个参数:要执行的sql语句
//第三个参数:回调函数,该exec执行完毕之后会执行的C语言函数,如果你需要在该操作执行完毕的时候,做一些其他操作,就需要实现该回调函数,一般我们直接给NULL
//第四个参数:是第三个参数中回调函数的第一个参数
//第五个参数:错误日志
int result = sqlite3_exec(sqliteHandle, sql.UTF8String, NULL, NULL , NULL);
if (result == SQLITE_OK) {
NSLog(@"无返回结果集的操作成功");
}else{
NSLog(@"无返回结果集的操作失败-----%d",result);
}
}
/打开或者创建数据库
[self createDB];
//建表操作
NSString* sql = @"create table if not exists stu(name text unique,age integer,gender char)";
[self noQueryOpertion:sql];
//插入数据操作
NSString* sqlInsert = @"insert into stu values('李四',20,'男')";
[self noQueryOpertion:sqlInsert];
//更新操作
NSString* sqlUpdate = @"update stu set age = 100 where age = 20";
NSString* sqlUpdate1 = @"update stu set name = '张三' where name = '李四'";
[self noQueryOpertion:sqlUpdate];
[self noQueryOpertion:sqlUpdate1];
//关闭数据库
sqlite3_close(sqliteHandle);
查询操作
//数据库的查询操作
//参数为要执行的sql语句
- (void)queryOpertion:(NSString*)sql{
//伴随指针(相当于我们进行查询操作的时候,该指针可以理解为存储了一条一条的记录。我们获取一条记录的所有信息都是通过伴随指针)
sqlite3_stmt* stmt = NULL;
//预执行sql语句,如果预执行成功,那么我们就可以获取一条一条的记录,如果预执行失败,一般说明我们的sql语句有问题,不能获取表中的记录信息
//第一个参数:数据库句柄
//第二个参数:要执行的sql语句
//第三个参数:要执行的sql语句的长度,要想全部执行完,就赋值为 -1
//第四个参数:伴随指针的地址
//第五个参数:如果sql语句不全部执行,该参数保存未执行的sql语句
int result = sqlite3_prepare(sqliteHandle, sql.UTF8String, -1, &stmt, NULL);
// 初始化一个可变数组用来存放所有的记录;每一条记录就相当于一个字典
NSMutableArray* recordMArray = [[NSMutableArray alloc] init];
if (result == SQLITE_OK) {
//说明预执行成功,可以取表中的记录了
//通过while循环将表中的每一条记录取出
//step方法每执行一次,伴随指针就会指向下一条记录,当所有的记录都取完之后,step函数的返回值就不等于SQLITE_ROW,循环也就停止了
while (sqlite3_step(stmt) == SQLITE_ROW) {
//进入循环体内,伴随指针就相当于一条记录
//从记录中取值,是一个字段一个字段取
//每次执行while循环,都是一条新的记录,要对应一个新字典
NSMutableDictionary* recordMDic = [[NSMutableDictionary alloc] init];
//取出第0列的值
const unsigned char* name = sqlite3_column_text(stmt, 0);
//将char* 转换为OC中可用的NSString*类型
NSString* nameString = [[NSString alloc] initWithCString:(const char *)name encoding:NSUTF8StringEncoding];
//
[recordMDic setObject:nameString forKey:@"name"];
//取出第一列的值
int age = sqlite3_column_int(stmt, 1);
//放入字典中
[recordMDic setObject:@(age) forKey:@"age"];
//取出第二列的值
const unsigned char* gender = sqlite3_column_text(stmt, 2);
NSString* genderString = [[NSString alloc] initWithCString:(const char *)gender encoding:NSUTF8StringEncoding];
[recordMDic setObject:genderString forKey:@"gender"];
[recordMArray addObject:recordMDic];
}
NSLog(@"%@",recordMArray);
}else{
NSLog(@"预执行失败---%d",result);
}
//释放掉伴随指针所持有的指针
sqlite3_finalize(stmt);
}
//调用该方法
[self queryOpertion:@"select * from stu"];