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。

iOS进阶第二天 (数据库)_第1张图片
SQLite近似类型规则表.png

SQLite字段约束条件:

iOS进阶第二天 (数据库)_第2张图片
SQLite字段约束条件.png
iOS进阶第二天 (数据库)_第3张图片
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.引入头文件
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"];

你可能感兴趣的:(iOS进阶第二天 (数据库))