FMDB第三方框架
FMDB是同AFN,SDWebImage同样好用的第三方框架,它以OC的方式封装了SQLite的C语言API,使得开发变得简单方便。
附上github链接https://github.com/ccgus/fmdb
FMDB有三个主要的类
(1)FMDatabase
一个FMDatabase对象就代表一个单独的SQLite数据库
用来执行SQL语句
(2)FMResultSet
使用FMDatabase执行查询后的结果集
(3)FMDatabaseQueue
用于在多线程中执行多个查询或更新,它是线程安全的
上demo
先导入libsqlite3.0.tbd库
将FMDB加入工程里,当然你也可以用cocopods导入FMDB
下面是创建数据库的代码
#import "ViewController.h"
#import "NSString+Tool.h"
#import "FMDB.h"
@interface ViewController ()
@property (nonatomic, strong) FMDatabase * database;
@end
@implementation ViewController
- (IBAction)selectAction:(id)sender {
if ([self.database open]) {
//返回查询数据的结果集
FMResultSet * rs = [self.database executeQuery:@"select * from t_student"];
//查询表中的每一个记录
while ([rs next]) {
NSString * name = [rs stringForColumn:@"name"];
NSUInteger age = [rs intForColumn:@"age"];
NSLog(@"name = %@, age = %@",name,@(age));
}
[self.database close];
}
}
- (IBAction)updateAction:(id)sender {
if ([self.database open]) {
BOOL flag = [self.database executeUpdate:@"update t_student set name = 'xiaohong' where name = 'dahuan'"];
if (flag) {
NSLog(@"修改成功");
}else {
NSLog(@"修改失败");
}
[self.database close];
}
}
- (IBAction)deleteAction:(id)sender {
if ([self.database open]) {
BOOL flag = [self.database executeUpdate:@"delete from t_student"];
if (flag) {
NSLog(@"删除成功");
}else {
NSLog(@"删除失败");
}
[self.database close];
}
}
- (IBAction)insertAction:(id)sender {
if ([self.database open]) {
BOOL flag = [self.database executeUpdate:@"insert into t_student (name,age) values (?,?)",@"dahuan",@18];
if (flag) {
NSLog(@"插入成功");
}else {
NSLog(@"插入失败");
}
[self.database close];
}
}
- (void)viewDidLoad {
[super viewDidLoad];
NSString * filename = [NSString cachaPathName:@"data.sqlite"];
NSLog(@"%@",filename);
//1、创建数据库
self.database = [[FMDatabase alloc] initWithPath:filename];
//2、打开数据库
if ([self.database open]) {
NSLog(@"打开数据库成功");
//3、创建表
BOOL flag = [self.database executeUpdate:@"create table if not exists t_student (id integer primary key autoincrement ,name text, age integer);"];
if (flag) {
NSLog(@"创建表成功");
} else {
NSLog(@"创建表失败");
}
//4、关闭数据库
[self.database close];
} else {
NSLog(@"打开数据库失败");
}
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
@end
同样我们封装一下FMDB的增删改查操作
FMDBManger.h
#import <Foundation/Foundation.h> @interface FMDBManger : NSObject /** 增、删、改的操作 */ + (BOOL)executeUpdate:(NSString*)sql; /** 查询的操作 */ + (NSArray *)executeQuery:(NSString*)sql; @end
FMDBManger.m
#import "FMDBManger.h" #import "NSString+Tool.h" #import "FMDB.h" static FMDatabase *_dataBase; @implementation FMDBManger + (void)initialize { // 1.创建数据库 NSString *fileName = [NSString cachaPathName:@"student.sqlite"]; _dataBase = [FMDatabase databaseWithPath:fileName]; // 2.打开数据库 if ([_dataBase open]) { NSLog(@"打开数据库成功"); // 3.创建表 BOOL flag = [_dataBase executeUpdate:@"CREATE TABLE IF NOT EXISTS t_student (id integer PRIMARY KEY AUTOINCREMENT, name text, age integer);"]; if (flag) { NSLog(@"创建表成功"); }else{ NSLog(@"创建表失败"); } // 4.关闭数据库 [_dataBase close]; }else{ NSLog(@"打开数据库失败"); } } /** 增、删、改的操作 */ + (BOOL)executeUpdate:(NSString*)sql { NSLog(@"sql:%@", sql); // 1.打开数据库 if ([_dataBase open]) { // 2.修改数据 BOOL flag = [_dataBase executeUpdate:sql]; // 3.关闭数据库 [_dataBase close]; return flag; } return NO; } /** 查询的操作 */ + (NSArray *)executeQuery:(NSString *)sql { // 0.初始化数组,用于存放查询数据 NSMutableArray *dataList = [NSMutableArray array]; // 1.打开数据库 if ([_dataBase open]) { // 2.准备查询数据 FMResultSet *resultSet = [_dataBase executeQuery:sql]; // 3.查询符合条件的数据 while ([resultSet next]) { // 4.获得数据 // 4.1根据字段名来获取数据 NSString *name = [resultSet stringForColumn:@"name"]; NSInteger age = [resultSet intForColumn:@"age"]; // 添加数据 [dataList addObject:@{@"name": name, @"age" : @(age)}]; NSLog(@"name:%@ age:%zi", name, age); } // 关闭数据库 [_dataBase close]; } return dataList; } @end
数据库有个基本概念,事务,生活中比如ATM取款要求是线程安全的,FMDB的以下很好的解决这个问题
#import "ViewController.h" #import "NSString+Tool.h" #import "FMDB.h" @interface ViewController () @property (nonatomic, strong) FMDatabaseQueue * queue; @end @implementation ViewController - (IBAction)insertAction:(id)sender { [self.queue inDatabase:^(FMDatabase *db) { if ([db open]) { [db executeUpdate:@"insert into t_person (name,money) values (?,?)",@"张三",@500]; [db executeUpdate:@"insert into t_person (name,money) values (?,?)",@"李四",@1000]; [db close]; } }]; } - (IBAction)deleteAction:(id)sender { [self.queue inDatabase:^(FMDatabase *db) { if ([db open]) { BOOL flag = [db executeUpdate:@"delete from t_person"]; if (flag) { NSLog(@"删除成功"); } else { NSLog(@"删除失败"); } [db close]; } }]; } - (IBAction)updateAction:(id)sender { //事务的好处:存储大量数据 [self.queue inDatabase:^(FMDatabase *db) { if ([db open]) { //添加事务操作 [db beginTransaction]; BOOL flag1 = [db executeUpdate:@"update t_person set monaaaey = 1000 where name = '张三'"]; BOOL flag2 = [db executeUpdate:@"update t_person set money = 500 where name = '李四'"]; if (!(flag1 && flag2)) { //事务回滚 [db rollback]; } //提交事务 [db commit]; [db close]; } }]; } - (IBAction)selectAction:(id)sender { [self.queue inDatabase:^(FMDatabase *db) { if ([db open]) { FMResultSet * rs = [db executeQuery:@"select * from t_person"]; while ([rs next]) { NSString * name = [rs stringForColumn:@"name"]; CGFloat money = [rs doubleForColumn:@"money"]; NSLog(@"name = %@ money = %lf",name,money); } [db close]; } }]; } - (void)viewDidLoad { [super viewDidLoad]; NSString * filename = [NSString cachaPathName:@"person.sqlite"]; //创建FMDatabaseQueue实例,不需要再去打开数据库 self.queue = [FMDatabaseQueue databaseQueueWithPath:filename]; //在多线程安全的情况下操作数据 [self.queue inDatabase:^(FMDatabase *db) { BOOL flag = [db executeUpdate:@"create table if not exists t_person (id integer primary key autoincrement, name text,money real);"]; if (flag) { NSLog(@"创建成功"); } else { NSLog(@"创建失败"); } [db close]; }]; } @end
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何在 .NET 中 使用 ANTLR4
· 后端思维之高并发处理方案
· 理解Rust引用及其生命周期标识(下)
· 从二进制到误差:逐行拆解C语言浮点运算中的4008175468544之谜
· .NET制作智能桌面机器人:结合BotSharp智能体框架开发语音交互
· 后端思维之高并发处理方案
· 想让你多爱自己一些的开源计时器
· Cursor预测程序员行业倒计时:CTO应做好50%裁员计划
· 上周热点回顾(3.24-3.30)
· 大模型 Token 究竟是啥:图解大模型Token