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(@"添加数据失败");

}

}

}];

}

查询

李洪强iOS面试总结之- FMDB的更多相关文章

  1. 李洪强iOS经典面试题156 - Runtime详解(面试必备)

    李洪强iOS经典面试题156 - Runtime详解(面试必备)   一.runtime简介 RunTime简称运行时.OC就是运行时机制,也就是在运行时候的一些机制,其中最主要的是消息机制. 对于C ...

  2. 李洪强iOS经典面试题155 - const,static,extern详解(面试必备)

    李洪强iOS经典面试题155 - const,static,extern详解(面试必备) 一.const与宏的区别(面试题): const简介:之前常用的字符串常量,一般是抽成宏,但是苹果不推荐我们抽 ...

  3. 李洪强iOS经典面试题144-数据存储

    李洪强iOS经典面试题144-数据存储   数据存储 sqlite中插入特殊字符的方法和接收到处理方法. 除'其他的都是在特殊字符前面加"/",而 ' -> '' .方法:k ...

  4. 李洪强iOS经典面试题142-第三方框架及其管理

    李洪强iOS经典面试题142-第三方框架及其管理   第三方框架及其管理 使用过CocoaPods吗?它是什么?CocoaPods的原理? CocoaPod是一个第三方库的管理工具,用来管理项目中的第 ...

  5. 李洪强iOS经典面试题140-UI

    李洪强iOS经典面试题140-UI   UI viewcontroller的一些方法的说明viewDidLoad,viewWillDisappear, viewWillAppear方法的 顺序和作用? ...

  6. 李洪强iOS经典面试题下

    李洪强iOS经典面试题下 21. 下面的代码输出什么? @implementation Son : Father - (id)init { self = [super init]; if (self) ...

  7. 李洪强iOS经典面试题

    李洪强iOS经典面试题 1. struct和class的区别 swift中,class是引用类型,struct是值类型.值类型在传递和赋值时将进行复制,而引用类型则只会使用引用对象的一个"指 ...

  8. 李洪强iOS经典面试题34-求两个链表表示的数的和

    李洪强iOS经典面试题34-求两个链表表示的数的和 问题 给你两个链表,分别表示两个非负的整数.每个链表的节点表示一个整数位. 为了方便计算,整数的低位在链表头,例如:123 在链表中的表示方式是: ...

  9. 李洪强iOS开发之iOS学习方法收集

    李洪强iOS开发之iOS学习方法收集 在这里收集一些iOS学习方法,会不断更新 项目 简述 日期 一年多iOS开发总结 作者总结了自己一年多的iOS学习经验,对于iOS初学者来说很多地方是可以借鉴的 ...

随机推荐

  1. Java实现TCP之Echo客户端和服务端

    Java实现TCP之Echo客户端和服务端 代码内容 采用TCP协议编写服务器端代码(端口任意) 编写客户机的代码访问该端口 客户机按行输入 服务器将收到的字符流和接收到的时间输出在服务器consol ...

  2. P3400: [Usaco2009 Mar]Cow Frisbee Team 奶牛沙盘队

    太水了,背包DP. (转载请注明出处:http://www.cnblogs.com/Kalenda/) ; var n,f,i,j,ans,t,tt:longint; q:array[..] of l ...

  3. [uwp开发]数据绑定那些事(2)

    接着上一篇来侃. 二.实体到控件之间的绑定 这儿不知道用实体这个词恰不恰当,凑活着理解就行了.他可以是一个类实例,也可以是一个集合. 所以,相应的我们就引入两个Demo,第一个介绍用简单的类作为作为数 ...

  4. ArtJS(原创)

    <script> /* 方法目录: [IE7 8 不支持trim()方法的弥补] [ 终止冒泡] [数字千分位] [js运算的替代方法(js3.3/1.1不等于3浮点计算有bug)] [日 ...

  5. 【每日scrum】NO.5

    尝试采用自己的地图,绘点并计算路径,但是地图打开出现问题.

  6. 四则运算(2)之软件单元测试:Right-BICEP

    一.Right-BICEP主要测试以下几方面的问题: Right-结果是否正确? B-是否所有的边界条件都是正确的? I-能查一下反向关联吗? C-能用其他手段交叉检查一下结果吗? E-你是否可以强制 ...

  7. 你自认为理解了JavaScript?

    关于Dmitry Baranovskiy 的博客中一篇文章(http://dmitry.baranovskiy.com/post/91403200),其中有五段小代码,用来测试是否理解 JavaScr ...

  8. 查看python selenium的api

    打开命令行工具,doc中输入: python -m pydoc -p 然后在浏览器中访问http://localhost:4567/,此时应该可以看到python中所有的Modules 按ctrl+f ...

  9. Codeforces Round #354 (Div. 2) C. Vasya and String

    题目链接: http://codeforces.com/contest/676/problem/C 题解: 把连续的一段压缩成一个数,对新的数组求前缀和,用两个指针从左到右线性扫一遍. 一段值改变一部 ...

  10. Leetcode#145 Binary Tree Postorder Traversal

    原题地址 递归写法谁都会,看看非递归写法. 对于二叉树的前序和中序遍历的非递归写法都很简单,只需要一个最普通的栈即可实现,唯独后续遍历有点麻烦,如果不借助额外变量没法记住究竟遍历了几个儿子.所以,最直 ...