博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
IOS FMDB
阅读量:4962 次
发布时间:2019-06-12

本文共 5006 字,大约阅读时间需要 16 分钟。

●  FMDB的优点
●  使用起来更加面向对象,省去了很多麻烦、冗余的C语言代码
●  对比苹果自带的Core Data框架,更加轻量级和灵活
●  提供了多线程安全的数据库操作方法,有效地防止数据混乱
 
●  FMDBgithub地址
●  https://github.com/ccgus/fmdb
 
 

FMDB有三个主要的类

FMDatabase
一个FMDatabase对象就代表一个单独的SQLite数据库 用来执行SQL语句

FMResultSet

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

FMDatabaseQueue

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

 

 

打开数据库

通过指定SQLite数据库文件路径来创建FMDatabase对象 FMDatabase *db = [FMDatabase databaseWithPath:path]; if (![db open]) {

 

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

文件路径有三种情况

具体文件路径
如果不存在会自动创建

空字符串@""

会在临时目录创建一个空的数据库
FMDatabase连接关闭时,数据库文件也被删除

nil

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

 

 

执行查询

查询方法

 

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

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

-(FMResultSet*)executeQuery:(NSString*)sql withArgumentsInArray:(NSArray *)arguments

示例

// 查询数据
FMResultSet *rs = [db executeQuery:@"SELECT * FROM t_student"];

// 遍历结果集

while ([rs next]) {

NSString *name = [rs stringForColumn:@"name"]; int age = [rs intForColumn:@"age"]; double score = [rs doubleForColumn:@"score"];

}

 

FMDatabaseQueue 

FMDatabase这个类是线程不安全的,如果在多个线程中同时使用一 个FMDatabase实例,会造成数据混乱等问题

为了保证线程安全,FMDB提供方便快捷的FMDatabaseQueueFMDatabaseQueue的创建

FMDatabaseQueue *queue = [FMDatabaseQueuedatabaseQueueWithPath:path];
简单使用
[queue inDatabase:^(FMDatabase *db) {

 

[db executeUpdate:@"INSERT INTO t_student(name) VALUES (?)", @"Jack"]; [db executeUpdate:@"INSERT INTO t_student(name) VALUES (?)", @"Rose"]; [db executeUpdate:@"INSERT INTO t_student(name) VALUES (?)", @"Jim"];
FMResultSet *rs = [db executeQuery:@"select * from t_student"]; while ([rs next]) {

// ...

} }];

 

使用事务

[queue inTransaction:^(FMDatabase *db, BOOL *rollback) {

 

[db executeUpdate:@"INSERT INTO t_student(name) VALUES (?)", @"Jack"]; [db executeUpdate:@"INSERT INTO t_student(name) VALUES (?)", @"Rose"]; [db executeUpdate:@"INSERT INTO t_student(name) VALUES (?)", @"Jim"];
FMResultSet *rs = [db executeQuery:@"select * from t_student"]; while ([rs next]) {

// ...

} }];

事务回滚 *rollback = YES;

1.打开数据库 2.创建表 3.查询表
#import "HMShopTool.h"#import "FMDB.h"#import "HMShop.h"@implementation HMShopToolstatic FMDatabase *_db;+ (void)initialize{    // 1.打开数据库    NSString *path = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject] stringByAppendingPathComponent:@"shops.sqlite"];    _db = [FMDatabase databaseWithPath:path];    [_db open];        // 2.创表    [_db executeUpdate:@"CREATE TABLE IF NOT EXISTS t_shop (id integer PRIMARY KEY, name text NOT NULL, price real);"];}+ (void)addShop:(HMShop *)shop{    [_db executeUpdateWithFormat:@"INSERT INTO t_shop(name, price) VALUES (%@, %f);", shop.name, shop.price];}+ (NSArray *)shops{
// 得到结果集 FMResultSet *set = [_db executeQuery:@"SELECT * FROM t_shop;"]; // 不断往下取数据 NSMutableArray *shops = [NSMutableArray array]; while (set.next) { // 获得当前所指向的数据 HMShop *shop = [[HMShop alloc] init]; shop.name = [set stringForColumn:@"name"]; shop.price = [set doubleForColumn:@"price"]; [shops addObject:shop]; } return shops;}@end
View Code
 
#import "HMViewController.h"#import "FMDB.h"#import "HMShop.h"#import "HMShopTool.h"@interface HMViewController ()//@property (nonatomic, strong) FMDatabase *db;@end@implementation HMViewController- (void)viewDidLoad{    [super viewDidLoad];    // 1.打开数据库    NSString *path = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject] stringByAppendingPathComponent:@"shops.sqlite"];    self.db = [FMDatabase databaseWithPath:path];    [self.db open];////    // 2.创表    [self.db executeUpdate:@"CREATE TABLE IF NOT EXISTS t_shop (id integer PRIMARY KEY, name text NOT NULL, price real);"];    // executeQuery:查询数据    [self.db executeQuery:<#(NSString *), ...#>];        // executeUpdate:除查询数据以外的其他操作    [self.db executeUpdate:<#(NSString *), ...#>];}- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{//    for (int i = 0; i<100; i++) {//        HMShop *shop = [[HMShop alloc] init];//        shop.name = [NSString stringWithFormat:@"枕头--%d", i];//        shop.price = arc4random() % 200;//        [HMShopTool addShop:shop];//    }        NSArray *shops = [HMShopTool shops];    for (HMShop *shop in shops) {        NSLog(@"%@ %f", shop.name, shop.price);    }        [self.db executeUpdate:@"DELETE FROM t_shop WHERE price < 800;"];        [self query];}- (void)query{    // 得到结果集    FMResultSet *set = [self.db executeQuery:@"SELECT * FROM t_shop;"];        // 不断往下取数据    while (set.next) {        // 获得当前所指向的数据        NSString *name = [set stringForColumn:@"name"];        double price = [set doubleForColumn:@"price"];        NSLog(@"%@ %f", name, price);    }}- (void)insert{    for (int i = 0; i<100; i++) {        NSString *name = [NSString stringWithFormat:@"手机-%d", i];#warning 这里的字符串不用再加上''        [self.db executeUpdateWithFormat:@"INSERT INTO t_shop(name, price) VALUES (%@, %d);", name, arc4random()%1000];    }}
View Code

 

 

 

转载于:https://www.cnblogs.com/liuwj/p/6696810.html

你可能感兴趣的文章
dashucoding记录2019.6.7
查看>>
IOS FMDB
查看>>
编码总结,以及对BOM的理解
查看>>
九涯的第一次
查看>>
PHP5.3的VC9、VC6、Thread Safe、Non Thread Safe的区别
查看>>
Android中全屏或者取消标题栏
查看>>
处理器管理与进程调度
查看>>
页面懒加载
查看>>
向量非零元素个数_向量范数详解+代码实现
查看>>
java zip 中文文件名乱码_java使用zip压缩中文文件名乱码的解决办法
查看>>
java if 用法详解_Java编程中的条件判断之if语句的用法详解
查看>>
kafka的java客户端_KAFKA Producer java客户端示例
查看>>
java -f_java学习笔记(一)
查看>>
java 什么题目好做_用java做这些题目
查看>>
java中的合同打印_比较方法违反了Java 7中的一般合同
查看>>
php 位运算与权限,怎么在PHP中使用位运算对网站的权限进行管理
查看>>
php include效率,php include类文件超时
查看>>
matlab sin函数 fft,matlab的fft函数的使用教程
查看>>
wcdma下行如何解扩解扰 matlab,WCDMA技术基础.ppt
查看>>
MySQL date_format() 函数
查看>>