iOS开发基础86-FMDB
1.iOS开发基础77-一像素线的几种实现方式2.iOS开发基础78-iOS 国际化3.iOS开发基础82-关于iOS目录4.iOS开发基础81-Runtime实战5.iOS开发基础80-关于Xcode86.iOS开发基础79-强制退出程序7.iOS开发基础90-密码学8.iOS开发基础89-Runloop9.iOS开发基础88-涂鸦效果10.iOS开发基础87-抽屉效果
11.iOS开发基础86-FMDB
12.iOS开发基础85-线程dispatch apply13.iOS开发基础84-HTTP请求方法详解与增删改查的应用14.iOS开发基础83-线程组15.iOS开发基础106-Instruments16.iOS开发基础105-Xcode收集Crashs的各种方法17.iOS开发基础104-正向代理和反向代理18.iOS开发基础103-APP之间跳转19.iOS开发基础102-后台保活方案20.iOS开发基础101-指纹和面部识别21.iOS开发基础100-MDM证书申请流程22.iOS开发基础99-iOS 内购的防范与优化23.iOS开发基础98-跳转淘宝案例24.iOS开发基础97-应用内购(In-App Purchase)的安全性解析与收据处理流程25.iOS开发基础96-UI类继承关系图26.iOS开发基础95-程序内评价27.iOS开发基础94-xcode1028.iOS开发基础93-GCD死锁29.iOS开发基础92-线程保活30.iOS开发基础91-线程同步技术与资源共享详解31.iOS开发基础138-视频编码32.iOS开发基础137-音视频编解码简介33.iOS开发基础136-防暴力点击34.iOS开发基础135-Core Data35.iOS开发基础134-异步并行上传问题36.iOS开发基础133-崩溃预防37.iOS开发基础132-POSIX线程库38.iOS开发基础131-isa指针39.iOS开发基础130-视频录制上传40.iOS开发基础129-音频录制上传41.iOS开发基础128-应用本地化42.iOS开发基础127-深入探讨KVO43.iOS开发基础126-深入探索设计模式44.iOS开发基础125-深入探索SDWebImage45.iOS开发基础124-RunLoop实现卡顿检测46.iOS开发基础123-自动释放池原理47.iOS开发基础122-RunLoop48.iOS开发基础121-APP启动优化49.iOS开发基础120-通知与线程50.iOS开发基础119-组件化51.iOS开发基础118-Runtime52.iOS开发基础117-Hybrid53.iOS开发基础116-性能监控54.iOS开发基础115-Socket55.iOS开发基础114-YYCache56.iOS开发基础113-Unity3D57.iOS开发基础112-GCD常见场景58.iOS开发基础111-RAC59.iOS开发基础110-Core Graphics应用场景60.iOS开发基础109-网络安全61.iOS开发基础108-常见的编程范式62.iOS开发基础107-iOS直播63.iOS开发基础148-ABM vs MDM64.iOS开发基础147-ABM集中管理Apple设备65.iOS开发基础146-深入解析WKWebView66.iOS开发基础145-Apple Search Ads67.iOS开发基础144-逐字打印效果68.iOS开发基础143-性能优化69.iOS开发基础142-广告归因70.iOS开发基础141-音频解码71.iOS开发基础140-音频编码72.iOS开发基础139-视频解码73.iOS开发基础149-由UUIDString引发的思考一、基本使用方法
1. 安装 FMDB
使用 CocoaPods 安装 FMDB,可以在你的 Podfile
中添加以下内容:
pod 'FMDB'
然后运行 pod install
命令。
2. 导入 FMDB
在需要使用的文件中导入 FMDB:
#import <FMDB/FMDB.h>
二、基本示例代码
1. 数据库初始化
// 获取应用沙箱中的Documents目录路径
NSString *docsDir;
NSArray *dirPaths;
dirPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
docsDir = dirPaths[0];
// 设置数据库文件的完整路径
NSString *databasePath = [[NSString alloc] initWithString:[docsDir stringByAppendingPathComponent:@"test.db"]];
// 创建FMDatabase对象
FMDatabase *db = [FMDatabase databaseWithPath:databasePath];
// 打开数据库
if (![db open]) {
NSLog(@"无法打开数据库.");
return;
}
2. 创建表
// 创建SQL语句
NSString *sql_stmt = @"CREATE TABLE IF NOT EXISTS USERS (ID INTEGER PRIMARY KEY AUTOINCREMENT, NAME TEXT, AGE INTEGER)";
// 执行创建表的SQL语句
if (![db executeUpdate:sql_stmt]) {
NSLog(@"创建表失败");
}
3. 插入数据
// 插入语句
NSString *insertSQL = @"INSERT INTO USERS (NAME, AGE) VALUES (?, ?)";
// 执行插入操作
if (![db executeUpdate:insertSQL, @"John", @(30)]) {
NSLog(@"数据插入失败");
}
4. 查询数据
// 执行查询语句
FMResultSet *results = [db executeQuery:@"SELECT * FROM USERS"];
// 遍历查询结果
while ([results next]) {
int userId = [results intForColumn:@"ID"];
NSString *name = [results stringForColumn:@"NAME"];
int age = [results intForColumn:@"AGE"];
NSLog(@"用户ID: %d, 名字: %@, 年龄: %d", userId, name, age);
}
5. 关闭数据库
[db close];
三、封装工具类
为了在项目中更容易地使用数据库操作,我们可以封装一个数据库管理工具类。下面是 DBManager
工具类的具体实现。
DBManager.h
#import <Foundation/Foundation.h>
#import <FMDB/FMDB.h>
@interface DBManager : NSObject
// 单例方法,确保全局只创建一个实例
+ (instancetype)sharedInstance;
// 创建表的方法,参数是表名和列名及其数据类型的字典
- (void)createTable:(NSString *)tableName withColumns:(NSDictionary<NSString *, NSString *> *)columns;
// 插入数据的方法,参数是表名和列名-值的字典
- (void)insertIntoTable:(NSString *)tableName withValues:(NSDictionary<NSString *, id> *)values;
// 查询表中所有数据的方法,返回数据数组
- (NSArray *)queryAllFromTable:(NSString *)tableName;
@end
DBManager.m
#import "DBManager.h"
@interface DBManager ()
// FMDatabase对象,用于数据库操作
@property (nonatomic, strong) FMDatabase *db;
@end
@implementation DBManager
// 单例模式方法
+ (instancetype)sharedInstance {
static DBManager *instance = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
instance = [[self alloc] init];
});
return instance;
}
// 初始化方法
- (instancetype)init {
self = [super init];
if (self) {
[self setupDatabase];
}
return self;
}
// 初始化数据库
- (void)setupDatabase {
// 获取应用沙箱中的Documents目录路径
NSString *docsDir = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0];
// 设置数据库文件的完整路径
NSString *path = [docsDir stringByAppendingPathComponent:@"app.db"];
// 初始化FMDatabase对象
self.db = [FMDatabase databaseWithPath:path];
// 打开数据库
if (![self.db open]) {
NSLog(@"无法打开数据库.");
}
}
// 创建表的方法
- (void)createTable:(NSString *)tableName withColumns:(NSDictionary<NSString *, NSString *> *)columns {
// 创建SQL语句
NSMutableString *sql = [NSMutableString stringWithFormat:@"CREATE TABLE IF NOT EXISTS %@ (", tableName];
NSArray *keys = [columns allKeys];
// 拼接列名及其数据类型
for (int i = 0; i < keys.count; i++) {
[sql appendFormat:@"%@ %@", keys[i], columns[keys[i]]];
if (i < keys.count - 1) {
[sql appendString:@", "];
}
}
[sql appendString:@")"];
// 执行创建表的SQL语句
if (![self.db executeUpdate:sql]) {
NSLog(@"创建表 %@ 失败", tableName);
}
}
// 插入数据的方法
- (void)insertIntoTable:(NSString *)tableName withValues:(NSDictionary<NSString *, id> *)values {
// 创建插入SQL语句
NSMutableString *sql = [NSMutableString stringWithFormat:@"INSERT INTO %@ (", tableName];
NSMutableString *placeholders = [NSMutableString stringWithString:@") VALUES ("];
NSArray *keys = [values allKeys];
// 拼接列名和占位符
for (int i = 0; i < keys.count; i++) {
[sql appendString:keys[i]];
[placeholders appendString:@"?"];
if (i < keys.count - 1) {
[sql appendString:@", "];
[placeholders appendString:@", "];
}
}
[placeholders appendString:@")"];
[sql appendString:placeholders];
// 执行插入SQL语句
if (![self.db executeUpdate:sql withArgumentsInArray:[values allValues]]) {
NSLog(@"插入数据到 %@ 失败", tableName);
}
}
// 查询所有数据的方法
- (NSArray *)queryAllFromTable:(NSString *)tableName {
// 创建查询SQL语句
NSString *sql = [NSString stringWithFormat:@"SELECT * FROM %@", tableName];
// 执行查询
FMResultSet *results = [self.db executeQuery:sql];
// 存储查询结果的数组
NSMutableArray *resultArray = [NSMutableArray array];
while ([results next]) {
// 创建字典存储每一行数据
NSMutableDictionary *row = [NSMutableDictionary dictionary];
for (int i = 0; i < results.columnCount; i++) {
row[[results columnNameForIndex:i]] = [results objectForColumnIndex:i];
}
[resultArray addObject:row];
}
return resultArray;
}
@end
四、使用封装的工具类
通过封装的 DBManager
类,可以方便地进行数据库操作。以下是一些简单的示例:
#import "DBManager.h"
// 创建表
[[DBManager sharedInstance] createTable:@"USERS" withColumns:@{@"ID": @"INTEGER PRIMARY KEY AUTOINCREMENT", @"NAME": @"TEXT", @"AGE": @"INTEGER"}];
// 插入数据
[[DBManager sharedInstance] insertIntoTable:@"USERS" withValues:@{@"NAME": @"John", @"AGE": @(30)}];
// 查询数据
NSArray *users = [[DBManager sharedInstance] queryAllFromTable:@"USERS"];
for (NSDictionary *user in users) {
NSLog(@"用户: %@", user);
}
将来的你会感谢今天如此努力的你!
版权声明:本文为博主原创文章,未经博主允许不得转载。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· NetPad:一个.NET开源、跨平台的C#编辑器
· PowerShell开发游戏 · 打蜜蜂
· 凌晨三点救火实录:Java内存泄漏的七个神坑,你至少踩过三个!