你的位置:首页 > 操作系统

[操作系统]iOSDay36数据处理之数据库


1. 数据库管理系统

 1> SQL语言概述

  SQL: SQL是Structured Query Language(结构化查询语言)的缩写。SQL是专为数据库而建立的操作命令集, 是一种功能齐全的数据库语言。

 2> 常见的数据库

  MySQL: MySQL是一个精巧的SQL数据库管理系统, 而且是开源的数据管理系统。MySQL 主要目标是快速、健壮和易用。 由于它的强大功能、灵活性、丰富的应用编程接口(API)以及精巧的系统结果,受到了广大自由软件爱好者甚至是商业软件用户的青睐。

  Oracle:Oracle Database,又名Oracle RDBMS,或简称Oracle。是甲骨文公司的一款关系数据库管理系统。系统可移植性好、使用方便、功能强。

 3> 数据库特征:

  • 以一定的方式存储(表结构)

  • 能共享数据(很多人都能用)

  • 具有尽可能少的冗余代码(单表操作的代码相对而言简单,多表操作代码比较复杂)

  • 与程序彼此独立(与程序本身没有太大的关系)

 4> 数据库管理系统

  SQLite(http://www.sqlite.org/docs.html)是一个轻量级的关系数据库。 SQLite最初的设计目标是用于嵌入式系统,它占用资源非常少,在嵌入式设备中,只需要几百K的内存就够了,目前应用于Android、iOS、Window Phone等智能手机。iOS使用时SQLite,只需要加入libsqlite3.0.tbd依赖以及引入sqlite3.h头文件即可。

 5> 相关概念

  • 表:是数据库中一个非常重要的对象,是其他对象的基础。根据信息分类情况,一个数据库中可能包含若干个数据表。

  

2. SQL语句 

 1> SQLite数据库数据类型

  SQLite是无类型的数据库,可以保存任何类型的数据,对于SQLite来说对字段不指定类型是完全有效的。(注:良好的编程习惯应该要为字段标注类型)

  为了使sqlite和其他数据库间的兼容性最大化,sqlite支持"类型近似"的观点,列的类型近似指的是存储在列上数据的推荐类型。

 2> SQLite近似类型规则

  • 如果类型字符串中包含"INT",那么该字段的亲缘类型为INTEGER。

  • 如果类型字符串中包含"CHAR"、"CLOB"或"TEXT",那么该字段的亲缘类型为TEXT,如VARCHAR。

  • 如果类型字符串中包含"BLOB",那么该字段的亲缘类型为NONE。

  • 如果类型字符串中包含"REAL"、"FLOA"或"DOUB",那么该字段的亲缘类型为REAL

  • 其余情况下,字段的亲缘类型为NUMERIC

 3> 开始使用SQLite

  • 引入<sqlite3.h>头文件

  • 打开数据库

  • 执行SQL命令(建表,增删查改)

  • 关闭数据库

 4> SQLite语法

  • 创建或打开数据库

   sqlite3_open() 将根据文件路径打开数据库,如果不存在,则会创建一个新的数据库。如果result 等于常量 SQLITE_OK,则表示成功打开数据库。

   sqlite3 *db; db 一个打开的数据库实例。

   数据库文件的路径必须以 C语言字符串(而非NSString)传入。

 1  // 打开数据库,很多地方都会使用到数据库,所以初始化一个数据库的静态变量(句柄) 2   static sqlite3 *db = nil;  3  4   // 打开数据库,使用int去接收打开的结果 5   // 第一个参数:self.dbPath代表数据库的存储路径 6   // 第二个参数:二级指针,数据库的地址(句柄) 7    8   int result = sqlite3_open([self.dbPath UTF8String], &db); 9   10   // result是一个枚举值,有很多种情况11   if (result == SQLITE_OK) {12     NSLog(@"数据库打开成功");13   } else {14     NSLog(@"数据库打开失败");15   }

  • 关闭数据库:sqlite3_close(db);
1   int result = sqlite3_close(db);2   3   if (result == SQLITE_OK) {4     NSLog(@"数据库关闭成功");5   } else {6     NSLog(@"数据库关闭失败");7   }

  • 执行sql语句

  sqlite3_exec() 可以执行任何SQL语句,比如创表、更新、插入和删除操作。但是一般不用它执行查询语句,因为它不会返回查询到的数据

  • 预执行

  

  插入数据

 1   // 当values不确定的情况下使用问号(?)代替,之后会进行值绑定的过程 2   NSString *insertStr = @"insert into person(name, gender, age) values(?, ?, ?)"; 3    4   // 伴随指针 5   sqlite3_stmt *stmt = NULL; 6    7   // 预执行语句 8    9   /*10    int SQLITE_STDCALL sqlite3_prepare(11     sqlite3 *db,12     const char *zSql,13     int nByte,14     sqlite3_stmt **ppStmt,15     const char **pzTail16     );17   */18   // 第一个参数db:数据库19   // 第二个参数zSql:sql语句20   // 第三个参数nByte:有正、负之分,例如:1,表示只往后一个字节;如果为负数,遇到特殊符号(\000,u000)才会结束读取21   // 第四个参数pzTail:是伴随指针,需要自己进行创建,会随着数据库的相关操作确定其中问号(?)的值22   // 第五个参数ppStmt:取值的时候取不全,剩下的值就都存在这里23   int result = sqlite3_prepare(db, [insertStr UTF8String], -1, &stmt, NULL);24   25   if (result == SQLITE_OK) {26     27     // 操作成功的方法里进行问号(?)值的一些绑定设置28     29     // 第一个参数:伴随指针30     // 第二个参数:? 的位置,从1开始31     // 第三个参数:表示要插入的值32     // 第四个参数:有正、负之分,例如:1,表示只往后一个字节;如果为负数,遇到特殊符号(\000,u000)才会结束读取33     // 第五个参数:回调函数34     sqlite3_bind_text(stmt, 1, [name UTF8String], -1, NULL);35     sqlite3_bind_text(stmt, 2, [gender UTF8String], -1, NULL);36     sqlite3_bind_int64(stmt, 3, age);37     38     // sql语句执行完毕39     // 执行伴随指针,根据伴随指针的执行情况来判断是否插入成功[SQLITE_DONE代表伴随指针执行成功]40     if (sqlite3_step(stmt) == SQLITE_DONE) {41       NSLog(@"插入成功");42     } else {43       NSLog(@"插入失败");44     }45     46   } else {47     NSLog(@"result = %d", result);48   }49   // 一定要释放伴随指针50   sqlite3_finalize(stmt);

  更新数据

 1   NSString *updateStr = @"update person set name = '悟空' where uid = ?"; 2    3   sqlite3_stmt *stmt = NULL; 4    5   int result = sqlite3_prepare(db, updateStr.UTF8String, -1, &stmt, NULL); 6    7   if (result == SQLITE_OK) { 8     sqlite3_bind_int64(stmt, 1, uid); 9     10     if (sqlite3_step(stmt) == SQLITE_DONE) {11       NSLog(@"更新数据成功");12     } else {13       NSLog(@"更新数据失败");14     }15     16   } else {17     NSLog(@"result = %d", result);18   }19   sqlite3_finalize(stmt);

  删除数据

 1   NSString *deleteStr = @"delete from person where uid = ?"; 2    3   sqlite3_stmt *stmt = NULL; 4    5   int result = sqlite3_prepare(db, deleteStr.UTF8String, -1, &stmt, NULL); 6    7   if (result == SQLITE_OK) { 8     sqlite3_bind_int64(stmt, 1, uid); 9     10     if (sqlite3_step(stmt) == SQLITE_DONE) {11       NSLog(@"删除成功");12     } else {13       NSLog(@"删除失败");14     }15     16   } else {17     NSLog(@"result = %d", result);18   }19   sqlite3_finalize(stmt);

  查找所有数据

 1   NSString *selectStr = @"select * from person"; 2    3   sqlite3_stmt *stmt = NULL; 4    5   int result = sqlite3_prepare(db, selectStr.UTF8String, -1, &stmt, NULL); 6    7   if (result == SQLITE_OK) { 8     // 查找数据的时候当不知道有多少次的时候使用while循环 9     // sqlite3_step(stmt) == SQLITE_ROW 代表逐行执行数据10     while (sqlite3_step(stmt) == SQLITE_ROW) {11       // 第一个参数:伴随指针12       // 第二个参数:代表这个字段的位置【只有带问号的是从1开始,其余所有都是从0开始】13       int uid = sqlite3_column_int(stmt, 0);14       NSLog(@"uid = %d", uid);15       16       // 在OC代码中,要使用C语言的相关内容,应该使用utf-817       NSString *name = [NSString stringWithUTF8String:(const char *)sqlite3_column_text(stmt, 1)];18       NSLog(@"name = %@", name);19       20       NSString *gender = [NSString stringWithUTF8String:(const char *)sqlite3_column_text(stmt, 2)];21       NSLog(@"gender = %@", gender);22       23       int age = sqlite3_column_int(stmt, 3);24       NSLog(@"age = %d ***************", age);25     }26     27   } else {28     NSLog(@"result = %d", result);29   }30   sqlite3_finalize(stmt);

 




内蒙古旅游攻略自助游内蒙古旅游报价价格内蒙古旅游景点推荐内蒙古旅游团报价内蒙古旅游团购优惠深圳麦鲁小城电话?麦鲁小城网站? 新场古镇 被《色戒》唤醒的古镇 深圳麦鲁小城地址?麦鲁小城在什么地方? 深圳麦鲁小城团购价格?麦鲁小城儿童体验馆团购多少钱? 南方红豆杉森林公园门票多少钱?红豆杉森林公园有学生票吗? 顺德碧桂园酒店电话?广州顺德碧桂园酒店房价? 顺德碧桂园度假村酒店价格?碧桂园度假村酒店多少钱一晚? 顺德碧桂园度假村官网,碧桂园度假村酒店官方网站。 趵突泉附近有饭店吗?济南趵突泉吃饭多少钱? 趵突泉公园有吃饭的地方吗?济南趵突泉吃饭方便吗? 黄山颜公河漂流多大的孩子可以漂?颜公河漂流几岁的孩子能玩? 颜公河漂流门票最新价格?休宁颜公河漂流最新票价? 2015年春运是什么时候? 深圳哪里可以新年倒数? 1500元左右的旅游费如何悠闲的游桂林和阳朔? 老北京人早餐爱吃什么? 554-2222-100 Datasheet 554-2222-100 Datasheet 554-2231 Datasheet 554-2231 Datasheet 554-2231-100 Datasheet 554-2231-100 Datasheet 包头去香港迪士尼旅游 包头去香港迪士尼旅游 包头去香港迪士尼旅游 大庆参团去港澳旅游 大庆参团去港澳旅游 大庆参团去港澳旅游 太原去香港旅游 太原去香港旅游 太原去香港旅游