一、数据库管理系统

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

  2、常见的数据库:

  • MySQL:MySQL是一个精巧的SQL数据库管理系统,而且是开源的数据管理系统。MySQL主要目标是快速、健壮和易用。它拥有强大的功能、灵活性、丰富的应用编程接口(API)以及精巧的系统结构。
  • Oracle:Oracle Database,又名Oracle RDBMS,或简称Oracle。是甲骨文公司的一款关系数据库管理系统。系统可移植性好、使用方便、功能强。

  3、数据库特征:

  • 以一定方式存储在一起(表结构)。
  • 能为多个用户共享。
  • 具有尽可能少的冗余代码(单表操作的代码相对而言简单,多表操作的代码比较复杂)。
  • 与程序彼此独立的数据集合(与程序本身没有太大的关系)。

  4、数据库简介:

  • 数据库概述:数据库是按照数据结构来组织、存储和管理数据的仓库。
  • 数据库分类:关系型数据库(主流)、对象型数据库、层次式数据库。
  • 常用关系型数据库:
  • PC端:Oracle、MySQL、SQL Server、Access、DB2、Sybase。
  • 嵌入式\移动客户端:SQLite(iOS使用SQLite时,只需要加入libsqlite3.0.tbd依赖以及引入sqlite3.h头文件即可)

  5、表:

  • 表:是数据库中一个非常重要的对象,是其他对象的基础。根据信息的分类情况,一个数据库中可能包含若干个数据表。
  • 字段:表的“列”称为“字段”,每个字段包含某一专题的信息。
  • 记录:是指对应于数据表中一行信息的一组完整的相关信息。

二、SQL语句

  1、SQLite是无类型的数据库,可以保存任何类型的数据,对于SQLite来说对字段不指定类型是完全有效的。(建议为字段标注类型)

  2、SQLite近似类型规则:

  • 如果类型字符串中包含"INT",那么该字段的亲缘类型是INTEGER。
  • 如果类型字符串中包含"CHAR"、"CLOB"或"TEXT",那么该字段的亲缘类型是TEXT,如VARCHAR。
  • 如果类型字符串中包含"BLOB",那么该字段的亲缘类型是NONE。
  • 如果类型字符串中包含"REAL","FLOA","DOUB",那么该字段的亲缘类型是REAL。
  • 其余情况下,字段的亲缘类型为NUMERIC。

  3、SQLite字段约束条件

  • NOT NULL - 非空:该字段数据不能为空。
  • UNIQUE - 唯一:该字段数据不能重复。
  • PRIMARY KEY - 主键:一个表里可以没有主键,但是如果设置完主键,这个字段不能为空且不重复(建议一个表里最好设置主键,方便我们查找相关信息),在SQLite中,主键如果是整数类型,该列的值可以自动增长。
  • FOREIGN KEY - 外键:在MySQL里有一个连表查询,作用:可以根据外键查询另一张表的某条具体数据。
  • CHECK - 条件检查,确保一列中的所有值满足一定条件
  • DEFAULT - 默认:该字段数据可以给定默认值。
  • AUTOINCREMENT - 自增型变量:该字段数据如果为整型可以自动加1。

  4、SQL语句

  • 建表命令(Create table)
// 1.创建表
语法:
create table 表名(字段1 约束1 约束2,字段2 约束1 约束2);
// 事例:
需求:创建一个student表,表中的字段有学号,姓名,年龄;学号的约束条件:作为主键,自增,不能为空;姓名默认为'无名氏';年龄大于18岁
create table student(s_id integer primary key autoincrement not )); 
  • 数据插入命令(Insert)
/ .插入数据
语法:
insert into 表名(字段1, 字段2, ...)values(字段1值, 字段2值, ...);
insert into student(s_name, s_age)values();
insert into student(s_name, s_age)values();
  • 数据库更新命令(Update)
// 3.更新数据
语法:
update 表名 set 字段名1 = 修改值1, 字段名2 = 修改值2, .... where 条件
update student  ;
  • 数据库删除命令(Delete)
// 4.删除数据
语法:
delete from 表名 where 条件;
// 需求:删除年龄为10岁的学生
delete ;
  • 数据库检索命令(Select)
// 5.查询数据
语法:
select 要查找的字段 from 表名 where 条件;
// 查询姓名为阿萨德的所有信息(*表示查表中所有的字段)
select *from student where s_name = '阿萨德';

三、iOS的数据库技术实现

  1、开始使用SQLite:

  • 首先引入框架:
  • 选择lisbsqlite3.0.tbd,选择Add
  • 引入<sqlite3.h>头文件
// 引入数据库操作的头文件
#import <sqlite3.h> 
  • 打开数据库:sqlite3_open()函数将根据文件路径打开数据库,如果不存在,则会创建一个新的数据库。如果result等于常量SQLITE_OK,则表示成功打开数据库。(注:sqlite3 *db:一个打开的数据库实例。数据库文件的路径必须以C语言字符串传入)。代码示例:
// 打开数据库,很多地方都会使用到数据库,所以初始化一个数据库的静态变量
static sqlite3 *db = nil;
// 打开数据库
- (void)openDataBase
{
    // 打开数据库,使用int去接收打开的结果
    // 第一个参数:filename代表数据库的存储路径
    // 第二个参数:二级指针,数据库的地址
    int result = sqlite3_open([self.dbPath UTF8String], &db);

    // result是个枚举值,有很多种情况
    if (result == SQLITE_OK) {
        NSLog(@"数据库打开成功");
    }else {
        NSLog(@"数据库打开失败");
    }
}
  • 执行SQL命令(建表,增删改查),需要用到SQLite语法:执行sql语句和预执行。
  • 执行sql语句:函数sqlite3_exec()可以执行任何SQL语句,比如创建表、更新、插入和删除操作。但是一般不用它执行查询语句,因为它不会返回查询到的数据。代码示例(创建表和删除数据):
  • 创建表:
// 创建表
- (void)createTable
{
    // 创建一个person表,字段:uid integer类型 主键 自增 不能为空,name text类型,gender text类型,age integer类型
    NSString *createStr = @"create table person(uid integer primary key autoincrement not null, name text, gender text, age integer)";

    // 第一个参数:数据库
    // 第二个参数:sql语句,需要进行编码
    // 第三个参数:结果回调的一个函数
    // 第四个参数:回调函数的一个参数
    // 第五个参数:错误信息
    int result = sqlite3_exec(db, [createStr UTF8String], NULL, NULL, NULL);
    if (result == SQLITE_OK) {
        NSLog(@"创建表成功");
    }else {
        NSLog(@"创建表失败");
    }
    // 打印数据库的路径,检验表是否创建成功
    NSLog(@"_dbPath = %@", self.dbPath);

}
  • 删除数据:
// 通过uid去删除数据
- (void)deleteWithUID:(NSInteger)uid
{
    NSString *deleteStr = [NSString stringWithFormat:@"delete from person where uid = %ld", uid];
    int result = sqlite3_exec(db, deleteStr.UTF8String, NULL, NULL, NULL);
    if (result == SQLITE_OK) {
        NSLog(@"删除成功");
    }else {
        NSLog(@"删除失败");
    }
}
  • 预执行:
  • sqlite3_prepare():这个函数将sql文本转换成一个准备语句(prepare statement)对象,同时返回这个对象的指针。它实际上并不执行(evaluate)这个SQL语句,它仅仅为执行准备这个sql语句。
  • sqlite3_bind_*():给宿主参数(host parameters)绑定值(*代表不同类型)。
  • sqlite3_step():一次或多次来执行由前面sqlite3_prepare创建的准备语句。
  • sqlite3_column():这个过程从执行sqlite3_step()执行一个准备语句得到的结果集的当前行中返回一个列。每次sqlite3_step得到一个结果集的列停下后,这个过程就可以被多次调用去查询这个行的各列的值。对列操作是有多个函数,均以sqlite3_column为前缀。
  • sqlite3_finalize():这个过程销毁前面被sqlite3_prepare创建的准备语句,每个准备语句都必须使用这个函数去销毁以防止内存泄露。
  • 具体使用情况和这些函数的参数都在代码示例(增加,更新,查询)中具体说明:
  • 插入数据:(注:由于楼主较懒,所以部分相同代码注释只写了一遍)
// 插入数据
- (void)insertName:(NSString *)name gender:(NSString *)gender age:(NSInteger)age
{
    // 当values不确定的时候用?代替,之后会进行其值绑定的过程
    NSString *insertStr = @"insert into person (name, gender, age)values(?, ?, ?)";
    // 伴随指针
    sqlite3_stmt *stmt = NULL;

    // 预执行语句
    // 第一个参数:数据库
    // 第二个参数:sql语句
    // 第三个参数:有正负之分,例如:1,代表只往后读一个字节;如果为负,遇到特殊符号才会结束读取(\000,u000)
    // 第四个参数:伴随指针,会随着数据库的相关操作确定其中?的值
    // 第五个参数:取值的时候取得不全,剩下的值都存在这里
    , &stmt, NULL);
    if (result == SQLITE_OK) {
        // 在操作成功的方法里进行?值的一些绑定设置
        // 第一个参数:伴随指针
        // 第二个参数:?的位置(下标从1开始)
        // 第三个参数:表示要插入的值
        // 第四个参数:有正负之分,例如:1,代表只往后读一个字节;如果为负,遇到特殊符号才会结束读取
        // 第五个参数:回调函数
        sqlite3_bind_text(stmt, , name.UTF8String, -, NULL);
        sqlite3_bind_text(stmt, , gender.UTF8String, -, NULL);
        sqlite3_bind_int64(stmt, , age);
        // sql语句执行完毕
        // 执行伴随指针,根据伴随指针的情况判定是否插入成功SQLITE_DONE代表伴随指针执行数据成功
        if (sqlite3_step(stmt) == SQLITE_DONE) {
            NSLog(@"插入成功");
        }else {
            NSLog(@"插入失败");
        }

    }else {
        NSLog(@"result = %d", result);
    }
    // 释放伴随指针
    sqlite3_finalize(stmt);
}
  • 更新数据:
// 通过uid去更新数据
- (void)updateWithUID:(NSInteger)uid
{
    NSString *updateStr = @"update person set name = '悟空' where uid = ?";
    sqlite3_stmt *stmt = nil;
    , &stmt, NULL);
    if (result == SQLITE_OK) {
        sqlite3_bind_int64(stmt, , uid);
        if (sqlite3_step(stmt) == SQLITE_DONE) {
            NSLog(@"数据更新成功");
        }else {
            NSLog(@"数据更新失败");
        }
    }else {
        NSLog(@"result = %d", result);
    }

    sqlite3_finalize(stmt);

}
  • 查询所有数据:
// 查找所有数据
- (void)searchAll
{
    NSString *searchAllStr = @"select *from person";
    sqlite3_stmt *stmt = nil;
    // 预执行
    , &stmt, NULL);
    if (result == SQLITE_OK) {
        // 因为不知道要查询数据多少次,所以使用while循环
        // 第一个参数伴随指针
        // 第二个参数表示当前字段的位置[只有带?的是从1开始,其余下标都是从0开始]
        while (sqlite3_step(stmt) == SQLITE_ROW) {
            );
            NSLog(@"uid = %d", uid);

            // 在OC代码中要使用C语言的相关内容,应该使用utf-8
            NSString *name = [NSString stringWithUTF8String:()];
            NSLog(@"name = %@", name);
            NSString *gender = [NSString stringWithUTF8String:()];
            NSLog(@"gender = %@", gender);
            );
            NSLog(@"age = %d", age);

        }
    }else {
        NSLog(@"result = %d", result);
    }
    sqlite3_finalize(stmt);
}
  • 查询部分数据:
// 根据名字去查找相关的数据信息
- (void)searchWithName:(NSString *)name
{
    NSString *searchStr = @"select uid, gender, age from person where name = ?";
    sqlite3_stmt *stmt = nil;
    , &stmt, NULL);
    if (result == SQLITE_OK) {
        sqlite3_bind_text(stmt, , name.UTF8String, -, NULL);
        while (sqlite3_step(stmt) == SQLITE_ROW) {

            );
            NSLog(@"uid = %d", uid);
            NSString *gender = [NSString stringWithUTF8String:()];
            NSLog(@"gender = %@", gender);
            );
            NSLog(@"age = %d", age);
        }
    }else {
        NSLog(@"result = %d", result);
    }
    sqlite3_finalize(stmt);
}
  • 关闭数据库:使用sqlite3_close(db)函数关闭数据库,代码示例:
// 关闭数据库
- (void)closeDataBase
{
    int result = sqlite3_close(db);
    if (result == SQLITE_OK) {
        NSLog(@"数据库关闭成功");
    }else {
        NSLog(@"数据库关闭失败");
    }

} 
  • SQLite错误码:

iOS进阶学习-数据库的更多相关文章

  1. iOS进阶学习-CoreData

    一.CoreData数据库框架的优势 1.CoreData数据持久化框架是Cocoa API的一部分,首次在iOS5版本的系统中出现,它允许按照实体-属性-值模型组织数据,并以XML.二进制文件或者S ...

  2. iOS进阶学习-数据处理之文件读写

    一.沙盒机制 1.什么是沙盒? 每一个iOS应用程序都会为自己创建一个文件系统目录(文件夹),这个独立.封闭.安全的空间,叫做沙盒. 2.沙盒机制(SandBox) 沙盒是一种安全体系. 它规定了应用 ...

  3. iOS进阶学习笔记

    熟练掌握C/C++/Objective-C/Swift语言: 熟悉Cocoa Touch(Foundation,UIKit).Objective-C中block,gcd,NSOperation等: 熟 ...

  4. PHP程序员进阶学习书籍参考指南

    PHP程序员进阶学习书籍参考指南 @heiyeluren lastmodify: 2016/2/18     [初阶](基础知识及入门)   01. <PHP与MySQL程序设计(第4版)> ...

  5. C++ 入门到进阶 学习路线

    前言 学习这件事不在乎有没有人教你,最重要的是在于你自己有没有觉悟和恒心. -- 法布尔 简介 随着互联网及互联网+深入蓬勃的发展,经过40余年的时间洗礼,C/C++俨然已成为一门贵族语言,出色的性能 ...

  6. SQL Server 进阶 01 数据库的设计

    SQL Server 进阶 01 数据库的设计 本篇目录 课程内容回顾及介绍 为什么需要规范的数据库设计 设计数据库的步骤 绘制E-R(实体-关系)图 实体-关系模型 如何将E-R图转换为表 数据规范 ...

  7. Hibernate进阶学习4

    Hibernate进阶学习4 深入学习hibernate的查询语句 测试HQL查询 package com.hibernate.test; import com.hibernate.domain.Cu ...

  8. Hibernate进阶学习3

    Hibernate进阶学习3 测试hibernate的多表关联操作(一对多,多对一,多对多) 表之间的关系主要在类与元数据配置文件中体现 package com.hibernate.domain; i ...

  9. 42步进阶学习—让你成为优秀的Java大数据科学家!

    作者 灯塔大数据 本文转自公众号灯塔大数据(DTbigdata),转载需授权 如果你对各种数据类的科学课题感兴趣,你就来对地方了.本文将给大家介绍让你成为优秀数据科学家的42个步骤.深入掌握数据准备, ...

随机推荐

  1. 使用Servlet处理请求<http://blog.sina.com.cn/s/blog_5d3fb3cc0100ep9q.html>

    一.GET和POST的区别 1.GET提交的是文本内容,规定其数据长度不超过255个字符.在GET方式提交的URL中会显示出提交的查询数据而却提交数据的缓存会在浏览器的URL历史状态中,这样我们往往在 ...

  2. jetty简介

    Jetty 是一个开源的servlet容器,它为基于Java的web容器,例如JSP和servlet提供运行环境.Jetty是使用Java语言编写的,它的API以一组JAR包的形式发布.开发人员可以将 ...

  3. 详解Ossim 4.3控制台

    在Ossim 4.2以后的发行版中增加了控制台功能下面加以详细说明,当Ossim 启动之后,在控制台以root身份登录系统后会执行ossim-setup脚本,然后显示如下图1所示,了解这些功能,以及操 ...

  4. Loadrunner:安装LR11.0破解步骤及License

    破解步骤: 1.关闭LR相关程序 2.运行LicenseDelete程序,清除LR原来的License 3.将lm70.dll和mlr5lprg.dll这两个文件复制并粘贴到LR安装目录下的bin文件 ...

  5. C++ 牛人博客(不断更新中...)

    http://www.zhangjiee.com/ 新浪微博@独酌逸醉. Github. GitCafe. stackoverflow. Quora http://cpp1x.org/ 刘未鹏 | M ...

  6. poj3122 pie

    方法:二分. 题目意思:要过生日了,我请大家吃pie,然后人数一共是f+1(我自己).每个人的pie不能是拼接的,而且每个人的面积是一样的,这样就用二分枚举. 范围是0-最大的那块pie. 然后用每一 ...

  7. thinkphp实现分页

    public function zhanshi(){ $cate = M('cate'); //实例化数据表 $count = $cate->count(); //获取总的记录数 $Page = ...

  8. hdu 2255 奔小康赚大钱 KM算法

    看到这么奇葩的题目名我笑了,后来这么一个裸的KM调了2小时我哭了…… 这是个裸的KM算法,也没什么多说的,主要是注意多组数据时,每次都要把各种数组清空啊,赋值啊什么的,反正比较麻烦.至于为什么调了2小 ...

  9. 查看静态库(.a文件)内容

    可执行代码的二进制格式,看不到. 1.打开Terminal(终端), cd 到 .a包所在的文件夹 2.输入命令:lipo -info libtrafficstatisticszyf.a  结果如下:

  10. javscript处理XML DOM(待续)

    1.加载并解析XML文件 function loadXMLFile(url){ var xmldoc if(window.ActiveXObject){ xmldoc = new ActiveXObj ...