如何在Objective-C类中保存FMDB数据库引用?
在Objective-C类中保存FMDB数据库引用的正确方式
我在一个Objective-C类里用FMDB处理数据库连接,写了这样的伪代码:
// someClass.m - (void)sameDatabase:(NSString *)database{ if (database与之前的相同) { // 调用方法并访问此前在else分支中保存到someClass类的数据库引用 } else { ... [database open]; //FMDB // 将该数据库引用保存到someClass类中 // 调用方法并访问已保存到someClass类的数据库引用 } }
想请教下,该怎么在这个类里正确保存数据库引用呢?
你可以通过给someClass添加一个实例属性来保存FMDB的FMDatabase引用,这样就能在类的各个方法中复用这个连接了。下面是具体的实现步骤:
1. 在类的头文件(someClass.h)中声明属性
首先要声明一个强引用的FMDatabase属性,因为我们需要持有这个数据库实例防止它被释放:
#import <Foundation/Foundation.h> #import "FMDB.h" @interface someClass : NSObject @property (nonatomic, strong) FMDatabase *currentDatabase; - (void)sameDatabase:(NSString *)databasePath; @end
注意:这里把参数名改成了
databasePath更准确,因为你传入的应该是数据库文件的路径字符串,而不是FMDatabase实例本身。
2. 在实现文件(someClass.m)中完善逻辑
接下来修改你的方法,判断路径是否相同,然后更新或复用数据库引用:
#import "someClass.h" @implementation someClass - (void)sameDatabase:(NSString *)databasePath{ // 先判断当前是否已有数据库引用,并且路径匹配 BOOL isSameDatabase = (self.currentDatabase != nil && [self.currentDatabase.databasePath isEqualToString:databasePath]); if (isSameDatabase) { // 复用已有的数据库连接,直接调用方法访问self.currentDatabase即可 NSLog(@"复用已有的数据库连接"); [self doSomethingWithDatabase:self.currentDatabase]; } else { // 如果之前有打开的数据库,先关闭 if (self.currentDatabase != nil && [self.currentDatabase isOpen]) { [self.currentDatabase close]; } // 创建新的数据库实例并打开 FMDatabase *newDatabase = [FMDatabase databaseWithPath:databasePath]; if ([newDatabase open]) { self.currentDatabase = newDatabase; NSLog(@"成功打开新的数据库"); [self doSomethingWithDatabase:self.currentDatabase]; } else { NSLog(@"打开数据库失败: %@", newDatabase.lastError); } } } // 示例方法:用数据库引用执行操作 - (void)doSomethingWithDatabase:(FMDatabase *)db{ // 这里写你的数据库操作逻辑,比如执行查询 FMResultSet *rs = [db executeQuery:@"SELECT * FROM some_table"]; // ...处理结果集 } @end
关键注意点:
- 强引用属性:用
strong修饰currentDatabase,确保数据库实例不会被ARC自动释放。 - 关闭旧连接:切换数据库时一定要先关闭之前的连接,避免资源泄漏。
- 路径判断:通过
databasePath来判断是否是同一个数据库,用isEqualToString:做字符串比较是可靠的。 - 错误处理:打开数据库时要判断是否成功,避免后续操作因无效引用崩溃。
如果你的类是单例类(比如全局的数据库管理类),这个方案同样适用,只需要确保单例的属性正确初始化即可。
内容的提问来源于stack exchange,提问作者four-eyes
相关产品推荐
相关产品推荐

