iOS基础-SQLite数据库--基础总结

孤舟蓑笠翁,独钓寒江雪!<海星星>

数据库管理系统

  • SQL: SQL 是Structured Query Language(结构化查询语言)的缩写,SQL是专为数据库而建立的操作命令集,是一种功能齐全的数据库语言.
    常见的数据库:
  • My SQL : MySQL是一个精巧的SQL数据库管理系统优点:免费,轻量级
  • Oracle : 甲骨文公司的一款关系数据库管理系统.系统可移植性好,使用方便,功能强.
数据库特征:
  • 以一定的方式存储在一起(表结构)
  • 能为多个用户共享
  • 具有尽可能少的冗余代码
  • 与程序彼此独立的数据集合
  • 数据库(Database)是按照数据结构来组织,存储和管理数据的仓库.
数据库SQLite优点

1: 是一款轻量级嵌入式数据库 (用于移动端).
2: 处理数据的速度,比MySql还要快.
3: SQLite不需要进行配置,这就意味着不需要安装
4: 它是一个不需要单独服务器进行操作的系统.
5: SQLite 是非常小,完全配置时小于400K,当省略一些可选文件时,小于250K.
6: SQLite 是自给自足的,也就意味着不需要任何外部依赖.

数据库分类
  • 关系型数据库(主流)
  • 1: 关系型数据库(主流): 关系型数据库是以行和列的形式存储数据,这种形式被称为表 (二维表格) ,组成数据库.
  • 1.1: 关系: 可以理解为一张为二维表,每一个关系都有一个关系名,也就是 表名.
  • 1.2: 属性: 可以理解为二维表中的一列,在数据库中称为 字段.
  • 1.3: 元组: 可以理解为二维表中的一行,在数据库中称为 记录.
  • 1.4: 域: 属性的取值范围,也就是数据库中某一列的 取值范围.
  • 1.5: 关键字: 一组可以唯一标识元组的属性. 数据库中称为主键. 可以由一个或者多个列组成.

表: 是数据库中一个非常重要的对象,是其他对象的基础.
字段: 表的”列”成为”字段” , 每个字段包含某一专题的信息.
记录: 是指对应于数据表中一行信息的一组完整的相关信息.

  • 对象型数据库
  • 对象型数据库: 把面向对象的方法和数据库的技术结合起来,使得数据库系统的分析, 设计尽可能最大程度的和人的思想, 以及对世界的认识保持一致.
  • 层次性数据库
  • 常用关系型数据库: PC :Orcsle ,My SQL ,SQL Server.Access.DB2 ;嵌入式:SQLite;

SQL语句:

  • 什么是SQL:
    1: SQL 是Structured Query Language(结构化查询语言)的缩写,SQL是专为数据库而建立的操作命令集,是一种功能齐全的数据库语言.
    2: 是一种关系型数据库,对数据库进行定义和 (增,删,改,查)的语言.
  • SQL语句:
    1: 用SQL语言编写的句子,代码.
    2: 在运行程序过程中,要操作 (增删改查:CRUD)数据库中的数据,必须使用SQL语句.
  • SQl语句特点:
    1: 不区分大小写 (例如: 在数据库中user和UsEr是一样的).
    2: 注意: 每条语句必须用分号";"结束.不能用关键字命名表,字段.
  • SQl语句种类
    1: 数据定义语句 (DDL: Data Definition language): 用来定义表的结构, 包括create tabel (建表), drop tabel (删表) 等操作.
    2: 数据操作语句 (DMl: Data Manipulate language):用来修改表内容, 包括insert, delete, update等.
    3: 数据查询语句 (DQl: Data Query language): 用来查询表内数据,关键字是select (也是DQL中 和 SQL中用得最多的操作).
  • SQL语句关键字
    建表命令: (Create table)
    数据插入命令:(Insert)
    数据库更新命令:(Update)
    数据库删除命令:(Delete)
    数据库检索命令:(Select)
  • 数据库的存储步骤:
    第 1 步 : 新建一张表.
    第 2 步 : 添加多个字段 (列, 属性, column).
    第 3 步 : 增加多条记录 (record, row:用于存放多个字段的对应值).

SQLite是无类型的数据库,可以保存任何类型的数据,对于SQLite来说对字段不指定类型是完全有效的.

SQLite近似类规则:

SQLite字段约束条件:

NOT NULL -非空(必填选项)
UNIQUE - 唯一(不能重复)
PRIMARY KEY - 主键(一般设置为integer或NSString;特点:1: NOT NULL 不为空 2: UNIQUE 不重复,(唯一标识))
FOREIGN KEY - 外键(该字段作为另一个表的主键,链表查询)
AUTOINCREMENT - 自增量变量(一般设置Integer设置,它会自动根据上一条数据自增)
CHECK -条件检查(确保一列中所有值满足一定条件)
DEFAULT - 默认
表里可以没有主键,主键不是必填选项,当把一个字段设置为PRIMARY KEY 那么这个字段为必填选项 (不可为空,不能重复)

字段类型一定要填


注:如果值是字符串或字符类型,需要用单引号括起来
update


update stu set gender = ‘ 女’ where gender = ‘男' ; 整列修改
update stu set gender = ‘ 女’ where name = ‘班长' ; 单条修改
delete


从stu里删除所有年龄为10的数据
查询select



查询一个表里所有数据当 select * from stu where name = ‘班长' ;

SQLite语法:
  • 执行sql语句 :sqlite3_exec()可以执行任何SQL语句,比如创表,更新,插入和删除操作.但是一般不用于它执行查询语句,因为它不会返回查询到的数据
执行SQL语句
    /*
     sqlite3_exec
     参数1: sqlite3 *,  数据库
     参数2: const char *sql, SQL语句转化成C语言格式
     参数3: int (*callback)(void *, int, char **, char **), 结果的回调函数
     参数4: void *,回调一个函数参数
     参数5: char **errmsg 错误信息
     */
  • 预执行:sqlite3_prepare( ) 这个函数将sql文本转换成一个准备语句(prepared statement)对象,同时返回这个对象的指针.他实际上并不执行(evaluate)这个SQL语句,他仅仅为执行准备这个sql语句.
 预执行语句:
     sqlite3_prepare(
     参数1: sqlite3 *db, 数据库.
     参数2: const char *zSql, SQL语句转格式.
     参数3: int nByte, 有正负之分,字节数 (正: 代表只往后读一个字节 负: 遇到特殊(结束)符号才会结束(\100,u000))
     参数4: sqlite3_stmt **ppStmt, 伴随指针的地址.
     参数5: const char **pzTail 取值不全的话,剩下的值全部存在这里,一般 NULL .
  • sqlite3_bind_( ) 给宿主参数(host parameters) 绑定值( 代表不同类型)
     绑定函数:   sqlite3_bind_text(
      参数1: sqlite3_stmt *, 伴随指针-->绑定参数,获取数据.
      参数2: int, 绑定values的值("也就是?")的位置,从 1 开始.
      参数3: const char *, 表示你要插入绑定数据的值(UTF8String)
      参数4: int, 取字节数,有正负之分,字节数 (正: 代表只往后读一个字节 负: 遇到特殊(结束)符号才会结束(\100,u000))
      参数5: void (*)(void *) SQLITE3执行完操作后回调此函数,通常用于释放字符串占用的内存
      )     
  • sqlite3_step ( ) 一次或多次来执行前面sqlite3_prepare 创建的准备语句<>

  • sqlite3_column( ) 这个过程从执行 sqlite3_step( ) 执行一个准备语句得到的结果集的当前行中返回一个列. 每次 sqlite3_step 得到一个结果集的列停下后,这个过程就可以被多次调用去查询这个行的各列的值. 对列操作是有多个函数,均以sqlite3_column为前缀

 sqlite3_column_text(
参数 1 : sqlite3_stmt 从sqlite3_prepare返回来的prepared statement对象的指针    
参数 2 : int iCol   指定这一行中想要被返回的列的索引即(从0 开始)前面SQL语句字段顺序的索引 (如果SQL 写的* 则索引顺序即表格里字段的顺序, 如果不同则表示的是SQL语句中字段的顺序)>
  • sqlite3_finalize( ) 这个过程销毁前面被 sqlite3_prepare 数据库创建的准备语句,每个准备语句都必须使用这个函数去销毁以防止内存泄露

defineSQLITE_OK 0 /* 成功 | Successful result */

/错误码开始/

defineSQLITE_ERROR 1 /* SQL错误 或 丢失数据库 | SQL error or missing database */

defineSQLITE_INTERNAL 2 /* SQLite 内部逻辑错误 | Internal logic error in SQLite */

defineSQLITE_PERM 3 /* 拒绝访问 | Access permission denied */

defineSQLITE_ABORT 4 /* 回调函数请求取消操作 | Callback routine requested an abort */

defineSQLITE_BUSY 5 /* 数据库文件被锁定 | The database file is locked */

defineSQLITE_LOCKED 6 /* 数据库中的一个表被锁定 | A table in the database is locked */

defineSQLITE_NOMEM 7 /* 某次 malloc() 函数调用失败 | A malloc() failed */

defineSQLITE_READONLY 8 /* 尝试写入一个只读数据库 | Attempt to write a readonly database */

defineSQLITE_INTERRUPT 9 /* 操作被 sqlite3_interupt() 函数中断 | Operation terminated by sqlite3_interrupt() */

defineSQLITE_IOERR 10 /* 发生某些磁盘 I/O 错误 | Some kind of disk I/O error occurred */

defineSQLITE_CORRUPT 11 /* 数据库磁盘映像不正确 | The database disk image is malformed */

defineSQLITE_NOTFOUND 12 /* sqlite3_file_control() 中出现未知操作数 | Unknown opcode in sqlite3_file_control() */

defineSQLITE_FULL 13 /* 因为数据库满导致插入失败 | Insertion failed because database is full */

defineSQLITE_CANTOPEN 14 /* 无法打开数据库文件 | Unable to open the database file */

defineSQLITE_PROTOCOL 15 /* 数据库锁定协议错误 | Database lock protocol error */

defineSQLITE_EMPTY 16 /* 数据库为空 | Database is empty */

defineSQLITE_SCHEMA 17 /* 数据结构发生改变 | The database schema changed */

defineSQLITE_TOOBIG 18 /* 字符串或二进制数据超过大小限制 | String or BLOB exceeds size limit */

defineSQLITE_CONSTRAINT 19 /* 由于约束违例而取消 | Abort due to constraint violation */

defineSQLITE_MISMATCH 20 /* 数据类型不匹配 | Data type mismatch */

defineSQLITE_MISUSE 21 /* 不正确的库使用 | Library used incorrectly */

defineSQLITE_NOLFS 22 /* 使用了操作系统不支持的功能 | Uses OS features not supported on host */

defineSQLITE_AUTH 23 /* 授权失败 | Authorization denied */

defineSQLITE_FORMAT 24 /* 附加数据库格式错误 | Auxiliary database format error */

defineSQLITE_RANGE 25 /* 传递给sqlite3_bind()的第二个参数超出范围 | 2nd parameter to sqlite3_bind out of range */

defineSQLITE_NOTADB 26 /* 被打开的文件不是一个数据库文件 | File opened that is not a database file */

defineSQLITE_ROW 100 /* sqlite3_step() 已经产生一个行结果 | sqlite3_step() has another row ready */

defineSQLITE_DONE 101 /* sqlite3_step() 完成执行操作 | sqlite3_step() has finished executing */

/错误码结束/

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

推荐阅读更多精彩内容