UI进阶 数据库 SQLite
1、数据库管理系统
SQL:SQL是Structured Query Language(结构化查询语言)的缩写。
SQL是专为数据库而建立的操作命令集,是一种功能齐全的数据库语言。
- 常见的数据库管理系统- MySQL:MySQL是一个精巧的SQL数据库管理系统,而且是开源的数据管理系统。MySQL 主要目标是快速、健壮和易用。由于它的强大功能、灵活性、丰富的应用编程接口(API)以及精巧的系统结构,受到了广大自由软件爱好者甚至是商业软件用户的青睐。
- Oracle:Oracle Database,又名Oracle RDBMS,或简称Oracle。是甲骨文公司的一款关系数据库管理系统。系统可移植性好、使用方便、功能强,使用需要付费。
 
- 数据库特征- 以一定的方式存储在一起
- 能多用户共享
- 具有尽可能少的冗余代码(单表操作的代码相对简单,多表联合操作的代码比较复杂)
- 与程序彼此独立的数据集合
 
- 什么是数据库- 数据库(Database)是按照数据结构来组织、存储和管理数据的仓库 
 
- 数据库分类- 关系型数据库(主流)、对象型数据库、层次式数据库 
 
- 常用关系型数据库- PC端:Oracle、MySQL、SQL Server、Access、DB2、Sybase - 嵌入式\移动客户端:SQLite 
 
- SQLite- SQLite (http://www.sqlite.org/docs.html) 是一个轻量级的关系数据库。SQLite最初的设计目标是用于嵌入式系统,它占用资源非常少,在嵌入式设备中,只需要几百K的内存就够了,目前应用于Android、iOS、Windows Phone等智能手机。iOS 使用时SQLite,只需要加入 libsqlite3.0.tbd依赖以及引入 sqlite3.h 头文件即可。 
- SQLite数据库数据类型 - SQLite是无类型的数据库,可以保存任何类型的数据,对于SQLite来说对字段不指定类型是完全有效的. - (注:良好的编程习惯应该要为字段标注类型) 
- 为了使sqlite和其他数据库间的兼容性最大化,sqlite支持“类型近似”的观点,列的类型近似指的是存储在列上数据的推荐类型。 - 1). 如果类型字符串中包含"INT",那么该字段的亲缘类型是INTEGER。 - 2). 如果类型字符串中包含"CHAR"、"CLOB"或"TEXT",那么该字段的亲缘类型是TEXT,如VARCHAR。 - 3). 如果类型字符串中包含"BLOB",那么该字段的亲缘类型是NONE。 - 4). 如果类型字符串中包含"REAL"、"FLOA"或"DOUB",那么该字段的亲缘类型是REAL。 - 5). 其余情况下,字段的亲缘类型为NUMERIC。  
 
 
- 数据库结构- 表:是数据库中一个非常重要的对象,是其他对象的基础。根据信息的分类情况,一个数据库中可能包含若干个数据表。  
- 字段:表的“列”称为“字段” ,每个字段包含某一专题的信息。  
- 记录:是指对应于数据表中一行信息的一组完整的相关信息。  
 
2、 SQL语句
- NOT NULL - 非空:数据库中允许除主键以外其他任何字段为空
- UNIQUE - 唯一:表示该字段中不能有重复的值
- PRIMARY KEY - 主键:非空且唯一,一个表里可以没有主键,但是如果设置了主键,主键非空且不重复(建议设置主键,方便查找表中数据)
- FOREIGN KEY - 外键:用于联表查询,简单的理解:一个表中的外键指向另外一个表的主键,外键可以重复。
 CHECK - 条件检查:确保一列中的所有值满足一定条件- 作用:用于预防破坏表之间连接的动作,也能防止非法数据插入外键列,因为它必须是它指向的那个表中的主键值之一 
 
- DEFAULT - 默认:如果没有设置值,将会添加默认值到该字段
- AUTOINCREMENT-自增型变量:当设置一个类型为integer的字段为自增型变量时,每次插入新纪录时,会自动创建该字段的值,默认开始值为1,每条递增加1。一般主键设置为自增型变量
- 创建表 - 语法: - create table if not exists 表名(字段1 字段类型 约束1 约束2,字段2 字段类型 约束); 
 if not exists 表示如果表不存在的情况下,再创建表,可以省略
- 示例
需求:创建一个student表,表中的字段有学号,姓名,年龄,学号作为主键,自增,不能为空;姓名默认为'无名氏';年龄大于16岁 create table if not exists student(s_id integer primary key autoincrement not null, s_name text default '无名氏', s_age integer check(s_age > 16)); 
 
- 插入数据 - 语法: - insert into 表名(字段1,字段2)values(字段1值,字段2值); 
- 示例 - 需求:插入一个学生,姓名'Mary',年龄 18 - insert into student(s_name,s_age)values('Mary',18); 
 
- 更新 - 语法: - update 表名 set 字段名1 = 修改值1, 字段名2 = 修改值2 where 条件; 
- 示例 - update student set s_age = 25, s_name = 'Tom' where s_name = 'Mary'; 
 
- 删除
- 语法: - delete from 表名 where 条件; 
- 示例 - 需求:删除年龄为10的学生 - delete from student where s_age = 10; 
 
- 查询数据
- 语法: - select 字段 from 表名 where 条件; 
- // 示例 - select * from student where s_name = 'Tom'; 
 
3、iOS的数据库技术的实现
Linux 系统级的SQLite 技术实现框架
Xcode 6中 libsqlite3.0.dylib
Xcode 7中 libsqlite3.0.tbd
添加libsqlite3.0.tbd框架步骤



- 引入<sqlite3.h>头文件  
- 打开数据库 
- 执行SQL命令(建表,增删改查) 
- 关闭数据库  
- #import "DataBaseHandle.h" 
 // 引用库文件使用尖括号
 #import <sqlite3.h> @interface DataBaseHandle ()
 /// 声明一个属性,存储数据库路径
 @property (nonatomic, copy) NSString *dbPath; @end static DataBaseHandle *dataBaseHandle = nil; @implementation DataBaseHandle // 单例
 + (instancetype)shareDataBaseHandle {
 if (dataBaseHandle == nil) {
 dataBaseHandle = [[DataBaseHandle alloc] init];
 }
 return dataBaseHandle;
 } // 懒加载
 - (NSString *)dbPath {
 if (_dbPath == nil) {
 // 数据库存在Documents文件夹下的person.sqlite中
 NSString *documentsPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:];
 _dbPath = [documentsPath stringByAppendingPathComponent:@"person.sqlite"];
 NSLog(@"%@", documentsPath);
 } return _dbPath;
 } // 打开数据库
 // 好多地方都会使用到数据库,所以初始化一个数据库的静态变量
 static sqlite3 *db = nil; - (void)openDataBase {
 // 如果数据库已经打开
 if (db != nil) {
 NSLog(@"数据库已经打开");
 return;
 }
 // 打开数据库,并创建一个整型变量(枚举值)去接收打开的结果
 // 第一个参数:filename代表数据库的存储路径,需要进行编码
 // 第二个参数:**ppDB 二级指针(指针的地址),代表数据库的地址
 // sqlite3_open的返回值为枚举类型
 int result = sqlite3_open([self.dbPath UTF8String], &db);
 if (result == SQLITE_OK) {
 NSLog(@"数据库打开成功");
 } else {
 NSLog(@"数据库打开失败");
 }
 } // 关闭数据库
 - (void)closeDataBase {
 // 参数为数据库
 int result = sqlite3_close(db);
 if (result == SQLITE_OK) {
 NSLog(@"数据库关闭成功");
 } else {
 NSLog(@"数据库关闭失败");
 }
 db = nil;
 } // 新建表
 - (void)createTable {
 /**
 * 创建一个person表,
 字段:
 uid integer类型 主键 自增 不能为空
 name text类型
 gender text类型
 age integer类型
 */
 // 1.创建一个字符串,存放创建表的sql语句
 NSString *createSql = @"create table if not exists person(uid integer primary key autoincrement not null, name text, gender text, age integer)";
 // 创建person表
 // 2.sqlite3_exec()可以执行任何sql语句,比如创建表,更新,插入和删除操作.但是一般不用它执行查询语句,因为它不会返回查询到的数据
 // 第一个参数:数据库
 // 第二个参数:编码过的sql语句
 // 第三个参数:结果回调的函数
 // 第四个参数:回调函数的参数
 // 第五个参数:错误信息
 int result = sqlite3_exec(db, [createSql UTF8String], NULL, NULL, NULL);
 if (result == SQLITE_OK) {
 NSLog(@"person表创建成功");
 } else {
 NSLog(@"person表创建失败");
 }
 // 打印数据库对的路径,检查表是否创建成功
 NSLog(@"%@", self.dbPath);
 } // 插入数据
 - (void)insertName:(NSString *)name
 gender:(NSString *)gender
 age:(NSInteger)age {
 // 1.准备sql语句,当values不确定的情况下使用?代替,之后会进行其值的绑定过程
 NSString *insertSql = @"insert into person(name,gender,age) values (?,?,?)"; // 2.创建伴随指针(用于获取sql语句,绑定参数和获取数据)
 sqlite3_stmt *stmt = NULL; // 3.预执行
 // 第一个参数:数据库
 // 第二个参数:编码过的sql语句, 在OC代码中使用C语言的相关内容,要进行编码
 // 第三个参数:有正负之分, 如果为正,例如1 -- 只往后读一个字节, 如果为负,例如-1 -- 遇到特殊符号(\000,u000)才会结束
 // 第四个参数:伴随指针,会伴随着数据库的相关操作,确定其中?的值
 // 第五个参数:取值的时候取不全,剩下的值都存在这里
 int result = sqlite3_prepare(db, insertSql.UTF8String, -, &stmt, NULL);
 if (result == SQLITE_OK) {
 // 4.如果操作成功,进行?值的绑定
 // 第一个参数:伴随指针
 // 第二个参数:?的位置,从1开始
 // 第三个参数:要绑定的值,如果是字符串,需要进行编码
 // 第四个参数:有正负之分, 如果为正,例如1 -- 只往后读一个字节, 如果为负,例如-1 -- 遇到特殊符号(\000,u000)才会结束
 // 第五个参数:回调函数
 sqlite3_bind_text(stmt, , name.UTF8String, -, NULL);
 sqlite3_bind_text(stmt, , gender.UTF8String, -, NULL);
 // age是integer类型的数据,需要用int64这个方法
 sqlite3_bind_int64(stmt, , age);
 // sql语句执行完毕
 // 5.单步执行伴随指针
 if (sqlite3_step(stmt) == SQLITE_DONE) {
 NSLog(@"数据插入成功");
 } else {
 NSLog(@"数据插入失败");
 }
 } else {
 NSLog(@"result = %d", result);
 }
 // 6.关闭伴随指针,释放内存
 sqlite3_finalize(stmt);
 } // 通过uid更新数据
 - (void)updateWithUID:(NSInteger)uid {
 // 1.准备sql语句
 NSString *updataSql = @"update person set name = '二芳' where uid = ?";
 // 2.创建伴随指针
 sqlite3_stmt *stmt = NULL;
 // 3.预编译
 int result = sqlite3_prepare(db, updataSql.UTF8String, -, &stmt, NULL);
 if (result == SQLITE_OK) {
 // 4.绑定参数
 sqlite3_bind_int64(stmt, , uid);
 // 5.执行
 if (sqlite3_step(stmt) == SQLITE_DONE) {
 NSLog(@"更新成功");
 } else {
 NSLog(@"更新失败");
 }
 } else {
 NSLog(@"result = %d", result);
 }
 // 6.关闭伴随指针
 sqlite3_finalize(stmt);
 } // 通过uid删除数据
 - (void)deleteWithUID:(NSInteger)uid { NSString *deleteSql = [NSString stringWithFormat:@"delete from person where uid = %ld", uid];
 int result = sqlite3_exec(db, deleteSql.UTF8String, NULL, NULL, NULL);
 if (result == SQLITE_OK) {
 NSLog(@"删除成功");
 } else {
 NSLog(@"%d",result);
 } } // 通过name删除数据
 - (void)deleteWithName:(NSString *)name { NSString *deleteSql = [NSString stringWithFormat:@"delete from person where name = '%@'", name];
 int result = sqlite3_exec(db, deleteSql.UTF8String, NULL, NULL, NULL);
 if (result == SQLITE_OK) {
 NSLog(@"删除成功");
 } else {
 NSLog(@"%d",result);
 }
 } // 查找所有数据
 - (void)searchAll {
 // 1.准备sql语句
 NSString *selectSql = @"select * from person";
 // 2.伴随指针
 sqlite3_stmt *stmt = NULL;
 // 3.预执行
 int result = sqlite3_prepare(db, selectSql.UTF8String, -, &stmt, NULL);
 if (result == SQLITE_OK) {
 // 4、单步执行sql语句,当到达结果集末尾时则返回值为SQLITE_DONE
 while (sqlite3_step(stmt) == SQLITE_ROW) {
 // 第一个参数:伴随指针
 // 第二个参数:当前字段在第几列(sql语句中写的要查找的字段),从0开始
 int uid = sqlite3_column_int(stmt, );
 NSString *name = [NSString stringWithUTF8String:(const char *)sqlite3_column_text(stmt, )];
 NSString *gender = [NSString stringWithUTF8String:(const char *)sqlite3_column_text(stmt, )];
 int age = sqlite3_column_int(stmt, );
 NSLog(@"uid = %d,name = %@, gender = %@, age = %d", uid, name, gender, age);
 }
 } else {
 NSLog(@"查询失败");
 }
 // 5.关闭伴随指针
 sqlite3_finalize(stmt);
 } // 根据姓名查找
 - (void)searchWithName:(NSString *)name {
 // 1.准备sql语句
 NSString *selectSql = @"select age,uid,gender from person where name = ?";
 // 2.伴随指针
 sqlite3_stmt *stmt = NULL;
 // 3.预执行
 int result = sqlite3_prepare(db, selectSql.UTF8String, -, &stmt, NULL);
 if (result == SQLITE_OK) {
 // 4.绑定参数
 sqlite3_bind_text(stmt, , name.UTF8String, -, NULL);
 // 5、单步执行sql语句,当到达结果集末尾时则返回值为SQLITE_DONE
 while (sqlite3_step(stmt) == SQLITE_ROW) {
 // 第一个参数:伴随指针
 // 第二个参数:当前字段在第几列,从0开始
 int uid = sqlite3_column_int(stmt, );
 // NSString *name = [NSString stringWithUTF8String:(const char *)sqlite3_column_text(stmt, 1)];
 NSString *gender = [NSString stringWithUTF8String:(const char *)sqlite3_column_text(stmt, )];
 int age = sqlite3_column_int(stmt, );
 NSLog(@"uid = %d,name = %@, gender = %@, age = %d", uid, name, gender, age);
 }
 } else {
 NSLog(@"查询失败");
 }
 // 6.关闭伴随指针
 sqlite3_finalize(stmt);
 } @end
 
UI进阶 数据库 SQLite的更多相关文章
- IOS开发-UI学习-sqlite数据库的操作
		IOS开发-UI学习-sqlite数据库的操作 sqlite是一个轻量级的数据库,它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够了,而且它的处理速度比Mysql.PostgreSQL这 ... 
- UI进阶 即时通讯之XMPP好友列表、添加好友、获取会话内容、简单聊天
		这篇博客的代码是直接在上篇博客的基础上增加的,先给出部分代码,最后会给出能实现简单功能的完整代码. UI进阶 即时通讯之XMPP登录.注册 1.好友列表 初始化好友花名册 #pragma mark - ... 
- Python进阶----数据库的基础,关系型数据库与非关系型数据库(No SQL:not only sql),mysql数据库语言基础(增删改查,权限设定)
		day37 一丶Python进阶----数据库的基础,mysql数据库语言基础(增删改查,权限设定) 什么是数据库: 简称:DataBase ---->DB 数据库即存放数据的仓库, ... 
- Android学习---如何创建数据库,SQLite(onCreate,onUpgrade方法)和SQLiteStudio的使用
		一.android中使用什么数据库? SQLite是遵守ACID的关系数据库管理系统,它包含在一个相对小的C程式庫中.它是D.RichardHipp建立的公有领域项目.SQLite 是一个软件库,实现 ... 
- python 学习笔记6(数据库 sqlite)
		26. SQLite 轻量级的关系型数据库 SQLite是python自带的数据库,可以搭配python存储数据,开发网站等. 标准库中的 sqlite3 提供该数据库的接口. 1. 基本语法如下 c ... 
- UI进阶 科大讯飞(2) 语音合成(文字转换成语音)
		科大讯飞开放平台.SDK下载.添加静态库.初始化见UI进阶 科大讯飞(1) 语音听写(语音转换成文字) 实现语音合成 功能实现步骤: 导入头文件 创建文字识别对象 指定文字识别后的回调代理对象 开启文 ... 
- 数据库SQLite在Qt5+VS2012使用规则总结---中文乱码
		VS2012默认格式为 "GB2312-80",而有时我们用到字符串需要显示中文时,就会出现乱码.下面仅就Qt5和VS2012中使用数据库SQLite时,做一个简单的备忘录 #in ... 
- Python信息采集器使用轻量级关系型数据库SQLite
		1,引言Python自带一个轻量级的关系型数据库SQLite.这一数据库使用SQL语言.SQLite作为后端数据库,可以搭配Python建网站,或者为python网络爬虫存储数据.SQLite还在其它 ... 
- (转)轻量级数据库 SQLite
		SQLite Expert – Personal Edition SQLite Expert 提供两个版本,分别是个人版和专业版.其中个人版是免费的,提供了大多数基本的管理功能. SQLite Exp ... 
随机推荐
- SRM588
			250: 有n首歌每首歌有duration和tone,连续唱m首歌会消耗每首歌的duration以及相邻两首歌的tone的差的绝对值的和,给个T,问说在T时间内最对能唱多少歌. 将歌按tone排序后发 ... 
- Python之函数篇
			函数形参 函数取得的参数是你提供给函数的值,这样函数就可以利用这些值 做 一些事情.这些参数就像变量一样,只不过它们的值是在我们调用函数的时候定义的,而非在函数本身内赋值. 参数在函数定义的圆括号对内 ... 
- 生成整数自增ID(集群主键生成服务)
			在集群的环境中,有这种场景 需要整数自增ID,这个整数要求一直自增,并且需要保证唯一性. Web服务器集群调用这个整数生成服务,然后根据各种规则,插入指定的数据库. 一般 ... 
- IE Web 开发支持将迁移到 StackOverflow
			http://stackoverflow.com/questions/tagged/internet-explorer 
- C#   设置鼠标指针
			鼠标光标指针的使用 #region 设置鼠标指针 //设置鼠标指针 //Cursor cus = new Cursor(@"C:\Users\Public\Pictures\Sample P ... 
- 基于邻接矩阵的广度优先搜索遍历(BFS)
			题目:http://acm.sdut.edu.cn/sdutoj/showproblem.php?pid=2141&cid=1186 #include<stdio.h> #incl ... 
- HNOI2008玩具装箱 (斜率优化)
			总算A了,心情好激动…… 如果会了一类斜率优化,基本上这类题就成了套模版了…… 只是k函数不同 var n,l,x,tail,head,m:int64; i,j:longint; dp,q,s:..] ... 
- 统一Matlab下不同子图的色标colorbar
			Reference:http://www.mathworks.com/matlabcentral/answers/100950-how-can-i-have-a-standard-colorbar-f ... 
- [转]ASP.NET MVC Jquery Validate 表单验证的多种方式介绍
			在我们日常开发过程中,前端的表单验证很重要,如果这块处理不当,会出现很多bug .但是如果处理的好,不仅bug会很少,用户体验也会得到很大的提升.在开发过程中我们可以不借助 JS 库,自己去手写 JS ... 
- Javascript 知识点简介
			如何在HTML中引入JS? 所有重定向的HTML标签内都可以嵌入javascript代码. 浮点数不要用 == 来进行判断 var num=0; for(var i=0;i<10;i++) ... 
