iOS开发系列-SQLite
概述
SQLite3是一款轻型的嵌入式数据库。它占用资源非常低,在嵌入式设备中,可能只需要几百K的内存就够了。它的处理速度比Mysql、PostgreSQL这两款著名的数据库速度还快。
数据库简介
常见的数据库可以分为2大类
- 关系型数据库(
主流) - 对象型数据库
常用的关系型数据库
- PC端:Oracle、MySQL、SQL Server、Access、DB2、Sybase
- 嵌入式\移动客户端: SQLite
对于iOS开发中小型、中型的数据存储可以使用Plist、偏好设置、NSCoding, 但是对于大型数据必须使用SQLite 数据库。苹果开发的CoreData也是对SQlite的封装。
SQLite
SQLite数据数据库存储数据以表(table)为单位的方式存储,每张表中对应很多字段,每个字段都有个对应的数据类型。

SQLite数据类型
SQLite将数据划分为以下几种存储类型:
integer整型值real浮点值text文本字符串blob二进制数据(比如文件)
提示:实际上SQLite是无类型的。就算声明为integer类型,还是能存储字符串文本(主键除外)
SQL语句
SQL语句是一种关系型数据库中的数据进行定义和操作的语言,是structured query language简写。特点就是不区分大小写、每条语句以分号;结尾。
常常将SQL语句分为三大类,分别为DDL、DML、DQL。
DDL
DDL(Data Definition Language)数据定义语句,包含create和drop等操作,在数据库中创建新表或删表(creat table 或 drop table)。
/* 创建表 */
create table if not EXISTS t_student(
id integer PRIMARY KEY AUTOINCREMENT,
name text,
score real
);
/* 删除表 */
drop table if exists t_student;
DML
DML(Data Manipulation language)数据操作语句,包括insert、update、delete等操作。
/* 插入数据 */
insert into t_student(id, name, score)values(1, 'Jake', 100.00);
insert into t_student(name, score) values ('Rose', 98.00);
/* 更新数据 */
update t_student set score = 99.00 WHERE name= 'Rose';
数据库中的字符串内容应该使用单引号栝住。
DQL
DML(Data Query language)数据查询语句,关键字select是所有SQL语句用的最多的语句。
/* 查询所有字段 */
select *from t_student;
/* 查询指定字段 */
select 字段1, 字段2, ... from t_student;
条件语句
如果只想更新或者删除某些固定的记录,那就必须在DML语句后加上一些条件

排序
对查询出来的结果可以使用order by进行排序
select *from t_student order by 字段 [desc\asc];
desc将结果按某个字段的降序排列,asc将结果按某个字段的升序排列。
也可以用多个字段进行排序
select *from t_student order by age asc, height desc;
先按找年龄排序(升序),年龄相等就按照身高排序(降序)。
limit
使用limit可以精确地控制查询结果的数量,必须每次只查询10条数据。
select *from t_student limit 10, 10;
可以理解为跳过最前面的10条语句,然后去10条数据。
limit常用作分页查询,固定每页的数量,然后传入对应也页码,获取数据。假设每页的数据为10条,获取第n页的数据
select *from t_student limit 10*(n-1), 10;
简单约束
建表时可以给特定的字段设置一些约束条件,常见的约束
not null规定字段的值不能为nullunique规定字段的值必须唯一default指定字段的默认值
外键约束
利用外键约束可以用来建立表与表之间的关系。外键的情况是:一张表的某个字段,引用者另一张表的主键字段。

/* 创建班级表 */
create table if not EXISTS t_class(
id integer PRIMARY KEY AUTOINCREMENT,
name text
);
/* 创建学生表 */
create table if not EXISTS t_student(
id integer PRIMARY KEY AUTOINCREMENT,
name text,
class_id integer,
/* 添加外键约束 */
constraint fk_t_student_class_id foreign key (class_id) references t_class(id)
);
表连接查询
表连接查询就是需要联合多张表才能查到想要的数据。
select stu.name, c.name from t_student stu, t_class c;

这种方式的联合查询获得的结果是笛卡尔积。需要增加条件
select stu.name, c.name from t_student stu, t_class c where stu.id = c.id;

如果想查询iOS学科的学生
select stu.name, sub.subject from t_student stu, t_subject sub `where stu.subject_id = sub.id and sub.subject='iOS'

Navicat图形界面
Navicat是一款著名的数据库管理软件,支持大部分主流的数据库(包括MySQL、SQLite)。
Navicate 建立数据库连接

Navicate创建表


执行SQL语句

修改表结构


执行SQL语句文件

SQLite编码
苹果提供了libsqlite3.tbd动态库,可以使用该动态库来使用SQLite存储数据。libsqlite3.tbd是纯C语言的。
在使用之前,在Target->Build Phase -> Link Binary with Libraries添加libsqlite3.tbd。

导入头文件#import <sqlite3.h>
创建数据库
int sqlite3_open( const char *filename, sqlite3 **ppDb);
第一个参数是生成SQLite数据库文件的路径。
第二个参数是返回的数据库实例。这个方法如果发现SQLite数据库文件已存在,就不会再创建。
返回值int类型,如果为SQLITE_OK代表创建数据库成功。
执行SQL语句
int sqlite3_exec(sqlite3*, const char *sql, int (*callback)(void*,int,char**,char**), void *, char **errmsg);
第一个参数是数据库实例。
第二个参数执行的SQL语句
第三个参数执行SQL语句的回调 可以传NULL
第四个参数是回调参数 一般传NULL
第五个参数 返回的错误
返回值int类型,如果为SQLITE_OK代表SQL语句执行成功。
该函数适用于创建表、删除表、数据的增、删、改等语句的执行。不能用于执行查询语句,因为查询函数需要返回数据。
查询数据
查询数据需要2个步骤,第一步验证SQL语句的合法性
int sqlite3_prepare_v2(sqlite3 *db, const char *zSql, int nByte, sqlite3_stmt **ppStmt, const char **pzTail );
第一个参数是数据库实例。
第二个参数执行的SQL语句
第三个参数SQL语句长度,一般传递-1,代表内部自己计算
第四个参数返回的结果集
第五个参数暂时用不到,一般传NULL
第二步查询数据
int sqlite3_step(sqlite3_stmt*);
传入第一步的返回的结果集实例
返回值如果为SQLITE_ROW代表查询到一条数据,如果存在数据的话,每调用一次该函数就会自动获取到下一条数据。因此可以使用while循环获取所有查询到的数据。
// 开始查询数据
while(sqlite3_step(ppStmt) == SQLITE_ROW){
int sid = sqlite3_column_int(ppStmt, 0);
const unsigned char *name = sqlite3_column_text(ppStmt, 1);
double score = sqlite3_column_double(ppStmt, 2);
NSLog(@"sid=%d, name=%s, score=%.2f", sid, name, score);
}
通过列的索引从结果集中获取数据,我们在写查询语句时select后写上列名,不要写*。
防止SQL注入
防止SQL注入,在写SQL语句查询语句时对于语句中的value使用占位符 ?,然后通过函数进行对占位符进行赋值
int sqlite3_bind_int(sqlite3_stmt*, int, int);
int sqlite3_bind_double(sqlite3_stmt*, int, double);
int sqlite3_bind_text(sqlite3_stmt*,int,const char*,int,void(*)(void*));
...
第一个参数 验证SQL合法性后返回的结果集
第二个参数 是占位符'?'在SQL语句的索引 注意索引是从1开始
对于int sqlite3_bind_text第三个参数传-1就好,回调传NULL
// 查询数据之前先检测SQL语句的合法性
char *sql = "select id, name, score from t_student where name like ?";
sqlite3_stmt *ppStmt = NULL; // 结果集
// -1 代表内部自己计算sql语句长度
int ret = sqlite3_prepare_v2(_db, sql, -1, &ppStmt, NULL);
if (ret == SQLITE_OK) {
NSLog(@"查询语句是合法的");
NSMutableArray *temp = [NSMutableArray array];
const char *c = [[NSString stringWithFormat:@"%%%@%%", condition] UTF8String];
// 防止SQL注入 设置占位符内容 从1开始
sqlite3_bind_text(ppStmt, 1, c, -1, NULL);
// 开始查询数据
while(sqlite3_step(ppStmt) == SQLITE_ROW){
int sid = sqlite3_column_int(ppStmt, 0);
const unsigned char *name = sqlite3_column_text(ppStmt, 1);
double score = sqlite3_column_double(ppStmt, 2);
NSLog(@"sid=%d, name=%s, score=%.2f", sid, name, score);
}
return [NSArray arrayWithArray:temp];
}else{
NSLog(@"查询语句是非法的");
return nil;
}
iOS开发系列-SQLite的更多相关文章
- iOS开发系列--数据存取
概览 在iOS开发中数据存储的方式可以归纳为两类:一类是存储为文件,另一类是存储到数据库.例如前面IOS开发系列-Objective-C之Foundation框架的文章中提到归档.plist文件存储, ...
- 我的iOS开发系列博文
之前目录性的总结了发表过的关于OC方面的文章,今天在目录性的总结一下有关iOS开发的文章.走过路过不要错过哦,今天的博文也全都是干货.写技术博客与大家交流一下思想也是不错的. 下面是我的技术博客中有关 ...
- 【转】iOS开发系列--数据存取
原文: http://www.cnblogs.com/kenshincui/p/4077833.html#SQLite 概览 在iOS开发中数据存储的方式可以归纳为两类:一类是存储为文件,另一类是存储 ...
- iOS开发系列之app的一天
本文主要讲述我对 iOS 开发的一些理解,希望能通过 app 从启动到退出,将一些的知识整合起来,形成一条知识链,目前涉及到的知识点有 runloop.runtime.文件存储.界面布局.离线推送.内 ...
- iOS开发系列--Swift语言
概述 Swift是苹果2014年推出的全新的编程语言,它继承了C语言.ObjC的特性,且克服了C语言的兼容性问题.Swift发展过程中不仅保留了ObjC很多语法特性,它也借鉴了多种现代化语言的特点,在 ...
- iOS开发系列文章(持续更新……)
iOS开发系列的文章,内容循序渐进,包含C语言.ObjC.iOS开发以及日后要写的游戏开发和Swift编程几部分内容.文章会持续更新,希望大家多多关注,如果文章对你有帮助请点赞支持,多谢! 为了方便大 ...
- iOS开发系列--App扩展开发
概述 从iOS 8 开始Apple引入了扩展(Extension)用于增强系统应用服务和应用之间的交互.它的出现让自定义键盘.系统分享集成等这些依靠系统服务的开发变成了可能.WWDC 2016上众多更 ...
- iOS开发系列--Swift进阶
概述 上一篇文章<iOS开发系列--Swift语言>中对Swift的语法特点以及它和C.ObjC等其他语言的用法区别进行了介绍.当然,这只是Swift的入门基础,但是仅仅了解这些对于使用S ...
- iOS开发系列--通知与消息机制
概述 在多数移动应用中任何时候都只能有一个应用程序处于活跃状态,如果其他应用此刻发生了一些用户感兴趣的那么通过通知机制就可以告诉用户此时发生的事情.iOS中通知机制又叫消息机制,其包括两类:一类是本地 ...
随机推荐
- Java获取文件Content-Type(Mime-Type)
Java获取文件Content-Type(Mime-Type) 刚好工作中要用到,所以总结一下.推荐使用第一种和第三种,实在不行,也可以去把http://tool.oschina.net/common ...
- CSS3——2D变形和3D变形
2D变形(CSS3) transform transform是CSS3中具有颠覆性的特征之一,可以实现元素的位移.旋转.倾斜.缩放,甚至支持矩阵方式,配合过渡和即将学习的动画知识,可以取代大量之前只能 ...
- MFC文档视图结构学习笔记
文档/视图概述 为了统一和简化数据处理方法,Microsoft公司在MFC中提出了文档/视图结构的概念,其产品Word就是典型的文档/视图结构应用程序 MFC通过其文档类和视图类提供了大量有关数据处理 ...
- C++在#include命令中,用〈 〉和“”有什么区别
使用尖括号表示在包含文件目录中去查找(包含目录是由用户在设置环境时设置的),而不在源文件目录去查找: 使用双引号则表示首先在当前的源文件目录中查找,若未找到才到包含目录中去查找.
- CF919D Substring (dag dp)
传送门 解题思路 感觉这种题都是套路,首先缩点判了环(没看见自环挂了一次..),然后设\(f[x][i]\)表示到了\(x\),\(i\)这个字母走过的最长距离,然后拓扑排序更新即可. 代码 #inc ...
- hibernate_01_SSH环境搭建
1.maven工程pom.xml文件 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="h ...
- XML、JSON、ProtocolBuffer特点比较
XML JSON PB Lua 数据结构支持 复杂结构 简单结构 较复杂结构 复杂结构 数据保存方式 文本 文本 二进制 文本 数据保存大小 大 一般 小 一般 解析效率 慢 一般 快 稍快 语言支持 ...
- http://www.narkii.com/club/forum-46-1.html 纳金学习论坛,主要是讨论一些unty3D方面的事情,技术栈比较前沿,
http://www.narkii.com/club/forum-46-1.html 纳金学习论坛,主要是讨论一些unty3D方面的事情,技术栈比较前沿,
- PyCharm中批量查找及替换
选中需要操作的字符 Ctrl + R 替换 Ctrl + Shift + F 全局查找 Ctrl + Shift + R 全局替换 源自: PyCharm中批量查找及替换 - Ella_Wu - 博客 ...
- C语言进阶学习第二章
本章重点记录指针的各种概念: 1.地址与内容 2.非法的赋值 3.NULL指针:NULL指针作为一个特殊的指针变量,表示不指向任何东西,在对指针进行解引用操作之前,首先必须 确保它并非NULL指针. ...