iOS中SQLite知识点总结2
数据库(SQLite)
01-多表查询
- 格式:select 字段1,字段2,... from 表名1,表名2;
- 别名:select 别名1.字段1 as 字段别名1,别名2.字段2 as 字段别名2,... from 表名1 as 别名1,表名2 as 别名2;
- 可以给表或字段单独起别名,as可省略
- 表连接查询:select 字段1,字段2,... from 表名1,表名2 where 表名1.id = 表名2.id;
- 外键:
- 如果表A的主关键字是表B中的字段,则该字段成为表B的外键
- 保持数据的一致性,完整性,主要目的是控制存储在外键表中的数据
- 使两张表形成关联,外键只能引用外表中列的值或使用空值
02-代码实现DDL语句
- 创建swift项目
- 导入系统框架sqlite3.tdb(sqlite3.dylib)
- 在Build Setting中搜索bridging,找到Objective-C Bridging Header,设置一个.h文件路径为桥接文件
- 打开桥接文件,导入头文件"sqlite3.h"
- 代码实现
- 打开数据库
- 获取沙盒路径,然后创建数据库的存储路径
- SQlite3数据库文件的扩展名没有一个标准定义,比较流行的选择是.sqlite3、.db、.db3
- 使用打开的数据库,执行DDL语句,创建一个数据库表
- 使用打开的数据库,执行DDL语句,删除一个数据库表
- 将数据库操作封装成一个工具类
- 打开数据库
03-代码实现DML语句
1.insert绑定参数
- 准备语句(prepared statement)对象
- 准备语句对象代表一个简单SQL语句对象的实例,这个对象通常被称为"准备语句"或者"编译好的SQL语句"或者就直接称为"语句"
- 操作历程:
- 使用sqlite3_prepare_v2或者相关的函数创建这个对象,如果执行成功,则返回SQLITE_OK,否则返回一个错误码
- 使用sqlite3_bind_*()给宿主参数绑定值
- 通过调用sqlite3_step()一次或多次来执行这个sql
- 对于DML语句,如果执行成功,返回SQLITE_DONE
- 对于DQL语句,通过多次执行获取结果集,继续执行的条件是返回值SQLITE_ROW
- 使用sqlite3_reset()重置这个语句,然后回到第2步,这个过程做0次或多次
- 使用sqlite3_finalize()销毁这个对象,防止内存泄漏
2.insert插入数据优化
- sqlite_exec直接执行和未拆解"准备语句"平均执行时间差不多
- sqlite_exec函数是对"准备语句"的封装
- (预处理语句->绑定参数->执行语句->重置语句->释放语句)
- 拆解后的"准备语句"执行,效率明显高了一些,主要原因是真准遵循了"准备语句"的操作流程
- 虽然按步骤使用"准备语句",但是执行效率依然不如意
- 原因分析:每当SQL调用执行方法执行了一个语句,都会开启一个叫事务的东西,执行完毕后再提交事务,也就是说,如果执行了10000次SQL语句,就打开和提交了10000次事务,所以造成耗时严重.
- 解决方案:只要在执行多个SQL语句之前,手动开启事务,在执行完毕之后,手动提交事务,这样再调用SQL方法执行语句时,就不会再自动开启和提交事务.
- 优化后的结果:插入10000条数据,大概耗时0.07秒
- 得出结论:
- 如果插入大量数据,请务必手动开启/提交事务
- 根据不同情况,选择使用sqlite3_exec或者"准备语句",如果操作单条语句,使用前者,如果大批量操作,选择后者
04-代码实现事务
- 概念:
- 事务(Transaction)是并发控制的单位,是用户定义的一个操作序列.
- 这些操作要么都做,要么都不做,是一个不可分割的工作单位.
- 通过事务,可以将逻辑相关的一组操作绑定在一起,保持数据的完整性.
- 事务通常是以begin transaction开始,以commit transaction或者rollback transaction结束
- commit表示提交,即提交事务的所有操作.具体的说就是将事务中所有对数据库的更新写回磁盘上的物理数据库中去,事务正常结束.
- rollback表示回滚,即在事务运行得过程中发生了某些故障,事务不能继续进行,系统将事务中对数据库的所有已完成的操作全部撤销,回滚到事务开始的状态.
05-代码实现DQL语句
1.使用sqlite3_exec
- 作用:可以通过回调来获取结果,步骤相对来说简单,结果数据类型没有特定类型(id)
- 参数说明
- 参数1:一个打开的数据库
- 参数2:需要执行的SQL语句
- 参数3:查询结果回调(执行0次或多次)
- 参数1:参数4的值
- 参数2:列的个数
- 参数3:结果值的数组
- 参数4:所有列的名称数组
- 返回值:0代表继续执行直到结束,1代表执行1次
- 参数4:回调函数的第一个值
- 参数5:错误信息
2.使用"准备语句"
- 作用:可以处理不同特定类型,步骤相对来说复杂
- 步骤:
- 通过预处理函数,获取"准备语句" sqlite3_prepare
- 不断执行"准备语句",直到无结果集 while sqlite3_step(stmt) == SQLITE_ROW
- 获取列的类型 sqlite3_column_type
- 根据每列的类型取出不同的值
- sqlite3_column_int64 SQLITE_INTEGER
- sqlite3_column_double SQLITE_FLOAT
- sqlite3_column_text SQLITE_TEXT
- 需要转换下字符串
- let cText = UnsafePointer
- let text = String(CString:cText,encoding:NSUTF8StringEncoding)
- NSNull() SQLITE_NULL
- 释放资源 sqlite3_finalize
06-FMDB基本使用
1.什么是FMDB
- FMDB是iOS平台的SQLite框架
- FMDB以OC的方式封装了SQLite的C语言API
2.FMDB有什么优势
- 使用起来更加面向对象,省去了很多麻烦,冗余的C语言代码
- 提供了多线程安全的数据库操作方法,有效地防止数据混乱
3.安装方式
- Cocoapods:"use_framework!",使用dynamic frameworks的方式集成
- 手动集成(swift):
- 导入FMDB文件
- 导入系统依赖库sqlite3.0.tbd
- 建立桥接文件,并导入需要的头文件
4.核心类
- FMDatabase
- 一个FMDatabase对象就代表一个独立的SQLite数据库
- 用来执行SQL语句
- FMResultSet
- 使用FMDatabase执行查询后的结果集
- FMDatabaseQueue
- 用于在多线程中执行多个查询或更新,它是线程安全的
5.使用步骤
- 打开数据库
- 通过指定SQLite数据库文件路径来创建FMDatabase对象
- 文件路径有3种情况:
- 具体文件路径(如果不存在会自动创建)
- 空字符串@""(会在临时目录创建一个空的数据库,当FMDatabase连接关闭时,数据库文件也被删除)
- nil(会创建一个内存中临时数据库,当FMDatabase连接关闭时,数据库会被销毁)
- FMDatabase *db = [FMDatabase databaseWithPath:path];
- if([db open]) { NSLog(@"打开成功"); }
- 执行更新
- 在FMDB中,除查询以外的所有操作,都称为"更新"
- create/drop/insert/update/delete等
- 使用executeUpdate方法执行更新
- 执行查询
- 关闭数据库:database.close();
07-FMDatabaseQueue
- FMDatabase这个类是线程不安全的,如果在多个线程中同时使用一个FMDatabase实例,会造成数据混乱等问题
- 为了保证线程安全,FMDB提供方便快捷的FMDatabaseQueue类
- FMDatabaseQueue的创建
- FMDatabaseQueue *queue = [FMDatabaseQueue databaseQueueWithPath:path];
- 简单使用
- [queue inDatabase:^(FMDatabase *db){在里面通过db执行SQL语句获取结果,对数据进行处理}];
- 使用事务
- [queue inTransaction:^(FMDatabase *db,BOOL *rollback){在里面通过db执行SQL语句获取结果,对数据进行处理}];
iOS中SQLite知识点总结2的更多相关文章
- iOS中SQLite知识点总结1
数据库(SQLite) 01-数据库简介 1.什么是数据库 数据库(Database)是按照数据结构来组织,存储和管理数据的仓库 2.数据库的分类 关系型数据库(主流) PC端:Oracle/MySQ ...
- iOS 中SQLite数据库操作
在iOS中实现SQLite数据库的操作:1.导入框架(libsqlite3.0.tbd) 2.导入头文件<sqlite3.h> 3.实现数据的增删改查 实现简单 SQLite数据库操作 的 ...
- 关于iOS中SQLITE句柄的使用的细节
1.设计思想:给SQLITE进行封装,利用定义的类别实现方法的简洁,以便达到低耦合效果 控制器代码: #import "ViewController.h" #import &quo ...
- iOS中sqlite版本号
https://github.com/yapstudios/YapDatabase/wiki/SQLite-version-(bundled-with-OS) https://github.com/y ...
- ios 中sqlite的用法
#import <sqlite3.h> @interface ViewController () { sqlite3 *_sqldb; } @end @implementation Vie ...
- 在IOS中使用DES算法对Sqlite数据库进行内容加密存储并读取解密
在IOS中使用DES算法对Sqlite 数据库进行内容加密存储并读取解密 涉及知识点: 1.DES加密算法: 2.OC对Sqlite数据库的读写: 3.IOS APP文件存储的两种方式及读取方式. 以 ...
- iOS项目开发中的知识点与问题收集整理②(Part 二)
1.点击UIButton 无法产生触摸事件 如果在UIImageView中添加了一个按钮,你会发现在默认情况下这个按钮是无法被点击的,需要设置UIImageView的userInteractio ...
- ios中常见数据存储方式以及SQLite常用的语句
在iOS中,根据不同的需求对应的有多种数据存储方式: 1.NSUserdefaults 将数据存储到沙盒中(library),方便易用,但是只能存储系统提供的数据类型(plist),不能存储自定义的 ...
- iOS中关于KVC与KVO知识点
iOS中关于KVC与KVO知识点 iOS中关于KVC与KVO知识点 一.简介 KVC/KVO是观察者模式的一种实现,在Cocoa中是以被万物之源NSObject类实现的NSKeyValueCodin ...
随机推荐
- HTML标签总结
HTML 基本文档 <!DOCTYPE html> <html> <head> <title>文档标题</title> </head& ...
- PHP数组操作——获取数组最后一个值的方法
php开发过程中,可能经常需要对取出的数组要获取数组的最后健或值.在这里总结了三个方法,并且跟据他们三个方法在一些情况下如何使用的条件限制进行了说明. <?php $array=array(1, ...
- 【pyhton】成员资格运算符
>>> name = '小甲鱼' >>> '鱼' in name True >>> '肥鱼' in name False 来自小甲鱼的课后习题
- [JavaScript] js 复制到剪切板
zeroclipboard官网:https://github.com/zeroclipboard/ZeroClipboard 下载压缩包,得到两个“ZeroClipboard.js”和“ZeroCli ...
- SAP修改前台屏幕字段文本
首先,要找到需要修改文本所对应的数据元素: 其次,进入CMOD,点击菜单栏中“转到--文本增强--关键字--更改”,填入数据元素,进入下一屏幕.将显示的文本全部改为自己需要的文本,保存即可.
- uva 11437 - Triangle Fun
计算几何: 直线交点: #include<cstdio> using namespace std; struct node { double x,y; node(,):x(x),y(y){ ...
- Django 安全策略的 7 条总结!
Florian Apolloner 发言主题为 Django 安全,其中并未讨论针对 SSL 协议的攻击--因为那不在 Django 涉及范围内.(如感兴趣可参考 https://www.ssllab ...
- 【网络流24题】 No.12 软件补丁问题(最小转移代价 最短路)
[题意] T 公司发现其研制的一个软件中有 n 个错误, 随即为该软件发放了一批共 m 个补丁程序. 每一个补丁程序都有其特定的适用环境, 某个补丁只有在软件中包含某些错误而同时又不包含另一些错误时才 ...
- 【 SPOJ - GRASSPLA】 Grass Planting (树链剖分+树状数组)
54 种草约翰有 N 个牧场,编号为 1 到 N.它们之间有 N − 1 条道路,每条道路连接两个牧场.通过这些道路,所有牧场都是连通的.刚开始的时候,所有道路都是光秃秃的,没有青草.约翰会在一些道 ...
- C++使用http请求,亲测可用,VS2008编译运行通过
int CMyFunctionsDlg::request(char* hostname, char* api, char* parameters) { WSADATA WsaData; WSAStar ...