李洪强经典面试题31- FMDB
n什么是FMDB
pFMDB是iOS平台的SQLite数据库框架
pFMDB以OC的方式封装了SQLite的C语言API
p nFMDB的优点
p使用起来更加面向对象,省去了很多麻烦、冗余的C语言代码
p对比苹果自带的Core Data框架,更加轻量级和灵活
p提供了多线程安全的数据库操作方法,有效地防止数据混乱
p nFMDB的github地址
phttps://github.com/ccgus/fmdb p
核心类
nFMDB有三个主要的类
pFMDatabase
ü一个FMDatabase对象就代表一个单独的SQLite数据库
ü用来执行SQL语句
ü pFMResultSet
ü使用FMDatabase执行查询后的结果集
ü pFMDatabaseQueue
ü用于在多线程中执行多个查询或更新,它是线程安全的
打开数据库
n通过指定SQLite数据库文件路径来创建FMDatabase对象
FMDatabase *db = [FMDatabasedatabaseWithPath:path];
if (![db open])
{
NSLog(@"数据库打开失败!");
}
n n文件路径有三种情况
p具体文件路径
ü如果不存在会自动创建
ü p空字符串@""
ü会在临时目录创建一个空的数据库
ü当FMDatabase连接关闭时,数据库文件也被删除
p pnil
ü会创建一个内存中临时数据库,当FMDatabase连接关闭时,数据库会被销毁
执行更新
n在FMDB中,除查询以外的所有操作,都称为“更新”pcreate、drop、insert、update、delete等
p n使用executeUpdate:方法执行更新
p- (BOOL)executeUpdate:(NSString*)sql, ...
p- (BOOL)executeUpdateWithFormat:(NSString*)format, ...
p- (BOOL)executeUpdate:(NSString*)sqlwithArgumentsInArray:(NSArray *)arguments
p n示例
[db executeUpdate:@"UPDATE t_student SET age = ? WHERE name = ?;", @20, @"Jack"]
执行查询
n查询方法
p- (FMResultSet *)executeQuery:(NSString*)sql, ...
p- (FMResultSet *)executeQueryWithFormat:(NSString*)format, ...
p- (FMResultSet *)executeQuery:(NSString *)sqlwithArgumentsInArray:(NSArray *)arguments
p n示例
// 查询数据
FMResultSet *rs = [db executeQuery:@"SELECT * FROMt_student"];
// 遍历结果集
while ([rs next])
{
NSString *name = [rs stringForColumn:@"name"];
int age = [rs intForColumn:@"age"];
double score = [rs doubleForColumn:@"score"];
}
李洪强

在面试的时候,如果问数据库怎么搞得,不能只说FMDB
可以这样说:
我用SQLite,FMDB也会封装这些东西,也会做一些改变,所以最终用这个框架去实现

用终端下载第三方框架
在桌面新建文件夹gitHub

输入 cd 拖入新建文件夹 回车 输入 git clone 把在github里下载第三方框架的地址拷贝过来 回车

现在就是正在下载的状态了...
在xcode 新建项目导入新框架


在项目里导入FMDB的头文件
#import "FMDB.h"

定义一个全局的属性dataBase
@property(nonatomic,strong)FMDatabase *dataBase;
判断数据库是否打开成功
- (void)viewDidLoad {
[super viewDidLoad];
// 1 - 创建数据库
NSString *path = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask, YES) lastObject]stringByAppendingPathComponent:@"student"];
FMDatabase *dataBase = [FMDatabasedatabaseWithPath:path];
self.dataBase = dataBase;
BOOL success = [dataBase open];
if (success) {
NSLog(@"数据库创建成功");
}else{
NSLog(@"数据库创建失败");
}
判断是否创建成功,只有创建成功才去执行第二步
2 - 创建表
执行 - 只要不是查询都用updata 更新
//2 - 创建表
NSString *str = @"CREATE TABLE IF NOT EXISTS t_student (id INTEGER PRIMARY KEY AUTOINCREMENT ,name TEXT NOT NULL ,score REAL NOT NULL)";
//执行
[self.dataBase executeUpdate:str];
}else{
NSLog(@"数据库创建失败");
}
做一个插入,一个查询,因为查询有代表性
- (IBAction)insertData:(UIButton *)sender {
//插入数据
for (int i = 0; i < 100; i ++) {
NSString *nameStr = [NSString stringWithFormat:@"周杰伦 - %d",i];
NSString *sqlStr = [NSStringstringWithFormat:@"INSERT INTO t_student (name,score)VALUES('%@',%.2f)",nameStr,arc4random_uniform(1000)/10.0];
//执行
BOOL success = [self.dataBase executeUpdate:sqlStr];
if (success) {
NSLog(@"添加成功");
}else{
NSLog(@"添加失败");
}
}


next方法
如果是YES,取到数据了
如果是NO 没有取到数据
如果取到,应该把两个数据拿出来
一个是name ,一个是score



用SQL和FMDB的使用的区别
线程安全
公共资源A使用的时候,B不能使用
一个公共的 值是100
A对公共的执行操作完成之前
B不能操作
在最新值的基础上再进行操作
操作之前连读取都不能
排队
A执行完成之后写到数据库,才是结束
枷锁
用FMDB加锁

新建一个项目: FMDB的线程安全
导入框架
一个是拖入框架,一个是导入系统的sql

1 - 指定沙盒路径
2 - 创建数据库队列
- (void)viewDidLoad {
[super viewDidLoad];
//指定沙盒路径
NSString *path = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES)lastObject]stringByAppendingPathComponent:@"data.sqlite"];
//创建数据库的队列
FMDatabaseQueue *dataBaseQ = [FMDatabaseQueuedatabaseQueueWithPath:path];
//线程安全
[dataBaseQ inDatabase:^(FMDatabase *db) {
BOOL success = [db open];
if (success) {
NSLog(@"创建库成功");
//2 - 创建数据库成功了,我才去创建表
NSString *str = @"CREATE TABLE IF NOT EXISTS t_student (id INTEGER PRIMARY KEY AUTOINCREMENT ,name TEXT NOT NULL ,score REAL NOT NULL)";
if ([db executeUpdate:str]) {
NSLog(@"创建表成功");
}else{
NSLog(@"创建表失败");
}
}else{
NSLog(@"创建库失败");
}
}];
}
接下来演示线程安全下的添加和查询数据
把创建的队列定义一个全局的属性
- (IBAction)insertData:(UIButton *)sender {
//线程安全下的增加数据
[self.dataBaseQ inDatabase:^(FMDatabase *db) {
for (int i = 0; i < 100; i ++) {
NSString *nameStr = [NSString stringWithFormat:@"周杰伦 - %d",i];
NSString *sqlStr = [NSStringstringWithFormat:@"INSERT INTO t_student (name,score)VALUES('%@,%.2f)",nameStr,arc4random_uniform(1000)/10.0];
BOOL success = [db executeUpdate:sqlStr];
if (success) {
NSLog(@"添加数据成功");
}else{
NSLog(@"添加数据失败");
}
}
}];
}
查询
李洪强经典面试题31- FMDB的更多相关文章
- 李洪强经典面试题49-Objective-C
李洪强经典面试题49-Objective-C 面试笔试都是必考语法知识的.请认真复习和深入研究OC. Objective-C 方法和选择器有何不同?(Difference between method ...
- 李洪强经典面试题152-Runtime
李洪强经典面试题152-Runtime Runtime Runtime是什么 Runtime 又叫运行时,是一套底层的 C 语言 API,其为 iOS 内部的核心之一,我们平时编写的 OC 代码, ...
- 李洪强经典面试题145-Runloop
李洪强经典面试题145-Runloop Runloop 什么是 Runloop? 从字面上讲就是运行循环. 它内部就是do-while循环,在这个循环内部不断地处理各种任务. 一个线程对应一个Ru ...
- 李洪强经典面试题136-KVO-KVC
李洪强经典面试题136-KVO-KVC KVC-KVO KVC的底层实现? 当一个对象调用setValue方法时,方法内部会做以下操作: ①检查是否存在相应key的set方法,如果存在,就调用se ...
- 李洪强经典面试题53-Swift
李洪强经典面试题53-Swift Swift 网上有很多Swift的语法题,但是Swift现在语法还未稳定,所以在这里暂时不贴出语法题,可以自行搜索. Swift和Objective-C的联系 Swi ...
- 李洪强经典面试题52-Block
李洪强经典面试题52-Block Block Block底层原理实现 首先我们来看四个函数 void test1() { int a = 10; void (^block)() = ^{ NSLo ...
- 李洪强经典面试题51-KVO-KVC
李洪强经典面试题51-KVO-KVC KVC-KVO KVC的底层实现? 当一个对象调用setValue方法时,方法内部会做以下操作: ①检查是否存在相应key的set方法,如果存在,就调用set ...
- 李洪强经典面试题48-C语言
可能碰到的iOS笔试面试题(4)--C语言 C语言,开发的基础功底,iOS很多高级应用都要和C语言打交道,所以,C语言在iOS开发中的重要性,你懂的.里面的一些问题可能并不是C语言问题,但是属于计 ...
- 李洪强经典面试题47--UNIX常用命令
可能碰到的iOS笔试面试题(3)--UNIX常用命令 做开发说用不到命令行,那肯定是不可能的.所以记住几个常用的命令还是很有用. cd 改变工作目录 pwd 输出当前工作目录的绝对路径在UNIX中要执 ...
随机推荐
- struts2特殊符号替换
今天用struts2做了一个小例子,结果发现个问题 action代码如下 private String table; public String execute(){ setName("pe ...
- redhat之数据挖掘R语言软件及rstudio-server服务的安装
安装时间:2015年8月25日 22:55:35 作者:luomg 软件:R.Rstudio-server 环境:redhat6.2 联系:luomgf@163.com 声明:如果你有遇到安装中的问题 ...
- blender--(凹凸贴图)................https://jingyan.baidu.com/article/9f63fb917c4becc8400f0ea8.html
在blender中直接绘制模型凹凸纹理细节 听语音 | 浏览:32 | 更新:2018-02-20 11:18 1 2 3 4 5 6 7 分步阅读 在blender中为了表现更多的模型细节,我们会常 ...
- ThinkPHP---TP功能类之公文管理功能
[一]准备工作 (1)创建数据表 表名:sp_doc create table sp_doc( id int(11) not null auto_increment, title varchar(50 ...
- jenkins部署遇到离线问题如何解决
部署jenkins页面时遇到离线问题如何解决 部署jenkins遇到一个问题,然后告诉我你的jenkins已经离线,什么鬼,后来找了很多博客 后来自己终于验证成功了,也分享给大家,只需把https改为 ...
- 王垠代表作《完全用Linux工作》
完全用Linux工作-王垠 <完全用Linux工作>作者:王垠 完全用 GNU/Linux 工作 理解 GNU/Linux 更多精彩请直接访问SkySeraph个人站点:www.sky ...
- 关闭的语句: next、关闭的 Resultset: next、关闭的连接: next问题
如果在rs.next()之前关闭了Statement或PreparedStatement,会导致下面的异常: java.sql.SQLException: 关闭的语句: next 如果在rs.next ...
- stm32实现iap远程固件更新
前提 想来做iap升级了,应该不是什么新手. 下面的程序需要用到一些简单的功能 串口收发数据开关总中断虽然本文标题是实现远程固件更新,但是具体远程方案本文不做详细说明,重点在于介绍mcu接收到新的固件 ...
- Springboot 添加数据源报错
报错信息如下: Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying be ...
- 【Codeforces 1019A】Elections
[链接] 我是链接,点我呀:) [题意] 每个人都有自己喜欢的队员 但是如果贿赂他们可以让他们更改自己喜欢的队员 问你最少要花多少钱贿赂队员才能让1号队员严格有最多的人喜欢? [题解] 除了1号之外, ...