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

    1. 核心类

    2. nFMDB有三个主要的类

    3. pFMDatabase

    4. ü一个FMDatabase对象就代表一个单独的SQLite数据库

    5. ü用来执行SQL语句

    6. ü pFMResultSet

    7. ü使用FMDatabase执行查询后的结果集

    8. ü pFMDatabaseQueue

    9. ü用于在多线程中执行多个查询或更新,它是线程安全的

    10. 打开数据库

    11. n通过指定SQLite数据库文件路径来创建FMDatabase对象

    12. FMDatabase *db = [FMDatabasedatabaseWithPath:path];

    13. if (![db open])

    14. {

    15. NSLog(@"数据库打开失败!");

    16. }

    17. n n文件路径有三种情况

    18. p具体文件路径

    19. ü如果不存在会自动创建

    20. ü p空字符串@""

    21. ü会在临时目录创建一个空的数据库

    22. ü当FMDatabase连接关闭时,数据库文件也被删除

    23. p pnil

    24. ü会创建一个内存中临时数据库,当FMDatabase连接关闭时,数据库会被销毁

    25. 执行更新

    26. n在FMDB中,除查询以外的所有操作,都称为“更新”pcreate、drop、insert、update、delete等

    27. p n使用executeUpdate:方法执行更新

    28. p- (BOOL)executeUpdate:(NSString*)sql, ...

    29. p- (BOOL)executeUpdateWithFormat:(NSString*)format, ...

    30. p- (BOOL)executeUpdate:(NSString*)sqlwithArgumentsInArray:(NSArray *)arguments

    31. p n示例

    32. [db executeUpdate:@"UPDATE t_student SET age = ? WHERE name = ?;", @20, @"Jack"]

    33. 执行查询

    34. n查询方法

    35. p- (FMResultSet *)executeQuery:(NSString*)sql, ...

    36. p- (FMResultSet *)executeQueryWithFormat:(NSString*)format, ...

    37. p- (FMResultSet *)executeQuery:(NSString *)sqlwithArgumentsInArray:(NSArray *)arguments

    38. p n示例

    39. // 查询数据

    40. FMResultSet *rs = [db executeQuery:@"SELECT * FROMt_student"];

    41. // 遍历结果集

    42. while ([rs next])

    43. {

    44. NSString *name = [rs stringForColumn:@"name"];

    45. int age = [rs intForColumn:@"age"];

    46. double score = [rs doubleForColumn:@"score"];

    47. }

李洪强

在面试的时候,如果问数据库怎么搞得,不能只说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的更多相关文章

  1. 李洪强经典面试题49-Objective-C

    李洪强经典面试题49-Objective-C 面试笔试都是必考语法知识的.请认真复习和深入研究OC. Objective-C 方法和选择器有何不同?(Difference between method ...

  2. 李洪强经典面试题152-Runtime

    李洪强经典面试题152-Runtime   Runtime Runtime是什么 Runtime 又叫运行时,是一套底层的 C 语言 API,其为 iOS 内部的核心之一,我们平时编写的 OC 代码, ...

  3. 李洪强经典面试题145-Runloop

    李洪强经典面试题145-Runloop   Runloop 什么是 Runloop? 从字面上讲就是运行循环. 它内部就是do-while循环,在这个循环内部不断地处理各种任务. 一个线程对应一个Ru ...

  4. 李洪强经典面试题136-KVO-KVC

    李洪强经典面试题136-KVO-KVC   KVC-KVO KVC的底层实现? 当一个对象调用setValue方法时,方法内部会做以下操作: ①检查是否存在相应key的set方法,如果存在,就调用se ...

  5. 李洪强经典面试题53-Swift

    李洪强经典面试题53-Swift Swift 网上有很多Swift的语法题,但是Swift现在语法还未稳定,所以在这里暂时不贴出语法题,可以自行搜索. Swift和Objective-C的联系 Swi ...

  6. 李洪强经典面试题52-Block

    李洪强经典面试题52-Block   Block Block底层原理实现 首先我们来看四个函数 void test1() { int a = 10; void (^block)() = ^{ NSLo ...

  7. 李洪强经典面试题51-KVO-KVC

    李洪强经典面试题51-KVO-KVC   KVC-KVO KVC的底层实现? 当一个对象调用setValue方法时,方法内部会做以下操作: ①检查是否存在相应key的set方法,如果存在,就调用set ...

  8. 李洪强经典面试题48-C语言

    可能碰到的iOS笔试面试题(4)--C语言   C语言,开发的基础功底,iOS很多高级应用都要和C语言打交道,所以,C语言在iOS开发中的重要性,你懂的.里面的一些问题可能并不是C语言问题,但是属于计 ...

  9. 李洪强经典面试题47--UNIX常用命令

    可能碰到的iOS笔试面试题(3)--UNIX常用命令 做开发说用不到命令行,那肯定是不可能的.所以记住几个常用的命令还是很有用. cd 改变工作目录 pwd 输出当前工作目录的绝对路径在UNIX中要执 ...

随机推荐

  1. Xcode相关概念:Target、Project、Scheme、Workspace

    创建并编译Xcode工程时,有几个常用概念想在这里记一下. Xcode Target: 定义:A target defines a single product; .... 理解:输出文件,等同于VS ...

  2. PHP 在表单POST提交后数据分页实现,非GET,解决只有第一页显示正确的问题

    //PHP 在表单POST提交后数据分页实现,非GET,使用SESSION,分页代码部分不在详述,主要为POST后的 除第一页之外的显示问题 //以下为ACTION页面 内容,仅为事例,当判断到页面未 ...

  3. C_动态库|静态库

    动态库 动态链接库简称DLL,同时以.dll 为后缀,主要用于提供代码和数据 dll 并不是所有数据都能被访问到,必须要进行导出 动态链接库在内存中始终只保存了一份数据,起到了节约内存的作用 生成动态 ...

  4. java虚拟机(二)--类加载机制和双亲委派模型

    一.类的生命周期 加载(Loading).验证(Verification).准备(Preparation).解析(Resolution).初始化(Initialization).使用(Using).卸 ...

  5. Python之IO编程

    前言:由于程序和运行数据是在内存中驻留的,由CPU这个超快的计算核心来执行.当涉及到数据交换的地方,通常是磁盘.网络等,就需要IO接口.由于CPU和内存的速度远远高于外设的速度,那么在IO编程中就存在 ...

  6. block相关归纳

    经过今天的Block的学习.上网查询相关文章归纳了一下 一.一个使用Block的好处有: Block可以用在许多不同的环境中,这样可以让代码更加简单,以及减少函数声明的数量,不用实现代理协议. 简单性 ...

  7. Tensorflow学习笔记(1):tf.slice()函数使用

    tensorflow 当中的一个常用函数:Slice() def slice(input_, begin, size, name=None) 函数的功能是根据begin和size指定获取input的部 ...

  8. typora_test

    加粗标题 加下标线 <!--aba--> #Include ![](C:\Users\123\Pictures\Saved Pictures\1.jpg) ![](http://gyz.g ...

  9. 访问请求参数request.getParameter()

    访问请求参数request.getParameter() 制作人:全心全意 getParameter() 例: 传递参数页: <%@ page language="java" ...

  10. 00 大王警语--be_a_new_gentleman

    大王博客:https://www.cnblogs.com/alex3714/ # 表面层次# 1,着装特体(服饰的牌子中高端)# 2,每天洗澡# 3,适当用香水# 4,女士优先# 5,不随地吐痰.不乱 ...