数据库(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 ...
随机推荐
-
[Java面经] 关于面试的二三事.
今天终于闲下来了, 那么也好总结下这几天面试的经历.四天的时间一共面了七家, 有一家是自己推迟了没有去.声明:如若转载请注明出处:http://www.cnblogs.com/wang-meng/p/ ...
-
How to fix the conflict between ROS Python and Conda
Problem: Ever since I have installed Conda, ROS does not seem to work. And predictably it is because ...
-
(七)中介者模式-C++实现
用一个中介对象来封装一系列的对象交互.中介者使各对象不需要显示地相互引用,从而使其解耦合松散而且可以独立地改变他们之间的交互. 中介者模式适合于 系统中不希望对象之间直接交互,即不希望类之间相互包含, ...
-
u3d_shader_surface_shader_4
Rim Lighting 轮廓自发光 一:疑问:1.总感觉在编辑器Scene状态下,脚本计算的ViewDir是我漫游的Cam,而不是项目中的MainCam啊! 然后就会造成Scene状态下轮廓自发光 ...
-
Python之什么是函数
我们知道圆的面积计算公式为: S = πr² 当我们知道半径r的值时,就可以根据公式计算出面积.假设我们需要计算3个不同大小的圆的面积: r1 = 12.34 r2 = 9.08 r3 = 73.1 ...
-
Android开发者:你真的会用AsyncTask吗?
[导读]在Android应用开发的过程中,我们需要时刻注意保证应用程序的稳定和UI操作响应及时,因为不稳定或响应缓慢的应用将给应用带来不好的印象,严重的用户卸载你的APP,这样你的努力就没有体现的价值 ...
-
从零开始学习MySQL3---数据库的基本操作
创建数据库 MySQL安装完成后,将会在其Data目录下自动创建几个必需的数据库 可以用 SHOW DATABASES: 来查看当前存在的数据库 创建数据库是在系统磁盘上划分一块区域用于数据的存储和 ...
-
hdu find the safest road
算法:多源最短路(floyd) 题意:每条通路有一个安全系数,求始点到终点的最大的安全系数并输出,如果没有输出What a pity! c++超时啊 Problem Description XX星球有 ...
-
MongoDB学习(翻译2)
C#驱动之LINQ教程 介绍 本教程涵盖了1.8发布版本对linq查询的支持. 开始本教程之前,你应该至少阅读下C#驱动教程关于C#驱动的介绍 快速开始 首先,添加下面命名空间到您的程序中: usin ...
-
PHP开发框架之YII框架学习——碾压ThinkPHP不是梦
前 言 JRedu 程序猿是一种慵懒的生物!能少敲一行代码,绝对不会多敲一个字符!所以,越来越多的开发框架应运而生,在帮助我们完成功能的同时,极大程度上也帮我们节省了人力物力,而且也提高了系统的 ...