iOS进阶第二天 (数据库)

  • 一、数据库管理系统
  • 二、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近似类型规则表.png

SQLite字段约束条件:

SQLite字段约束条件.png
SQLite字段约束条件解释.png

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"];
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 157,298评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,701评论 1 290
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 107,078评论 0 237
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,687评论 0 202
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,018评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,410评论 1 211
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,729评论 2 310
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,412评论 0 194
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,124评论 1 239
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,379评论 2 242
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,903评论 1 257
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,268评论 2 251
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,894评论 3 233
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,014评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,770评论 0 192
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,435评论 2 269
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,312评论 2 260

推荐阅读更多精彩内容