iOS开发基础86-FMDB

一、基本使用方法

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);
}
posted @ 2018-05-30 15:30  Mr.陳  阅读(454)  评论(0编辑  收藏  举报