FMDB的简单使用

    xiaoxiao2021-03-25  98

    从事iOS开发工作以来,对数据库操作用到最多的数据库三方库应该就是FMDB了,自己对平时使用FMDB的一些方法做了点总结,仅供参考,欢迎大家斧正

    首先,建立一个类,采用单例模式,对VideoDataBase进行操作,在.h文件中,我已经对各个方法的使用做了说明

    // Copyright © 2017年 drven. All rights reserved. // #import <Foundation/Foundation.h> #import "HCVideoInfo.h" typedef void (^HCVideoInfoArray)(NSArray *videoListArray); @interface HCVideoDataBase : NSObject //创建单例 + (instancetype)manager; //创建表 - (void)createTable; /** * 插入一条数据库 * */ - (BOOL)insertVideoInfo:(HCVideoInfo *)videoInfo; /* *读取所有Video */ - (void)queryVideoInfoArray:(HCVideoInfoArray)videoListArray; /** * 删除某条数据 */ - (BOOL)deleteVideoInfoFromVideoDB:(HCVideoInfo *)videoInfo; /** * 清空表(但不清除表结构) */ - (BOOL)truncateTable; /** * 清空表(同时清除表结构) * */ - (BOOL)dropTable; -(void)closeVideoDB; @end 接下来,对各个方法的使用做了具体说明

    // Copyright © 2017年 drven. All rights reserved. // #import "HCVideoDataBase.h" #import "FMDB.h" #define kHCDBTableNeedUpdate @"kHCDBTableNeedUpdate" //表单是否需要更新 #define kHCDBTableUser @"MYVIDEO" #define kHCDBName @"i5Family.db" static HCVideoDataBase *_sharedManager = nil; @interface HCVideoDataBase () /** * 具有线程安全的数据队列 */ @property (nonatomic,strong) FMDatabaseQueue *queue; @end @implementation HCVideoDataBase +(instancetype)manager{ static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ _sharedManager = [[HCVideoDataBase alloc]init]; }); return _sharedManager; } /** * 数据库队列的初始化:本操作一个 */ +(void)initialize{ //取出实例 HCVideoDataBase *coreFMDB=[HCVideoDataBase manager]; NSArray *paths = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES); NSString *libraryDir = [paths objectAtIndex:0]; NSString *rootFilePath = [NSString stringWithFormat:@"%@/%@",libraryDir,@"这里是项目中下载文件的路径"]; // 分别获取游客和正式用户的下载路径(方便起见直接使用对应ID作为路径名称) NSString *guestPath = [NSString stringWithFormat:@"%@/%@", rootFilePath, [HCAppMgr manager].uuid]; BOOL isDir = NO; NSFileManager *fileManager = [NSFileManager defaultManager]; BOOL existed = [fileManager fileExistsAtPath:guestPath isDirectory:&isDir]; if ( !(isDir == YES && existed == YES) ) { [fileManager createDirectoryAtPath:guestPath withIntermediateDirectories:YES attributes:nil error:nil]; } NSString *dbPath=[guestPath stringByAppendingPathComponent:kHCDBName]; DLog(@"dbPath:%@",dbPath); //创建队列 FMDatabaseQueue *queue =[FMDatabaseQueue databaseQueueWithPath:dbPath]; if(queue==nil) NSLog(@"code=1:创建数据库失败,请检查"); coreFMDB.queue = queue; //表单已经更新,需要删除重新创建 NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; BOOL updated = [[defaults objectForKey:kHCDBTableNeedUpdate] boolValue]; if (!updated) { [coreFMDB dropTable]; [defaults setObject:@"1" forKey:kHCDBTableNeedUpdate]; [defaults synchronize]; } //创建表单 [coreFMDB createTable]; } /** * 创建表结构 */ - (void)createTable { [self.queue inDatabase:^(FMDatabase *db) { if ([db open]) { [db setShouldCacheStatements:YES]; //创建SQL语句 NSString *sqlStr = [NSString stringWithFormat:@"%@%@%@%@%@%@", [NSString stringWithFormat:@"CREATE TABLE IF NOT EXISTS '%@' (id INTEGER PRIMARY KEY AUTOINCREMENT",kHCDBTableUser], @",videoid TEXT", @",videoname TEXT", @",info TEXT", @",coverfilename TEXT", @",urlpath TEXT)" ]; BOOL isExecute = [db executeUpdate:sqlStr]; if (isExecute) { } else { DLog(@"error occured while creating MYVIDEO table"); } } else { DLog(@"open datebase failed"); } }]; } //检查是否存在 video - (BOOL)existViedoInfo:(HCVideoInfo*)info{ __block BOOL exist = NO; [self.queue inDatabase:^(FMDatabase *db) { NSString *sql = [NSString stringWithFormat:@"select * from '%@' WHERE %@ = '%@';",kHCDBTableUser,@"videoid", info.videoid]; FMResultSet *set = [db executeQuery:sql]; exist = [set next]; [set close]; }]; return exist; } - (BOOL)insertVideoInfo:(HCVideoInfo *)videoInfo{ BOOL exist = [self existViedoInfo:videoInfo]; BOOL res = NO; if (exist == NO) { NSString *sqlStr = [NSString stringWithFormat:@"insert into '%@'(\ videoid,\ videoname,\ info,\ coverfilename,\ urlpath)\ VALUES('%@','%@','%@','%@','%@')", kHCDBTableUser, videoInfo.videoid, videoInfo.videoname, videoInfo.info, videoInfo.coverfilename, videoInfo.urlpath]; res = [self executeUpdate:sqlStr]; } return res; } -(void)queryVideoInfoArray:(HCVideoInfoArray)videoListArray{ // 创建空数组用于存放 video 对象 NSMutableArray *videoArray = [[NSMutableArray alloc] init]; [self.queue inDatabase:^(FMDatabase *fmDatabase) { // 书写 sql 语句 NSString *query = [NSString stringWithFormat:@"SELECT * FROM '%@'",kHCDBTableUser];//videoid,videoname,info,coverfilename,urlpath, query = [query stringByAppendingString:@" ORDER BY videoid DESC "]; FMResultSet *resultSet = [fmDatabase executeQuery:query]; if ([fmDatabase hadError]) { NSLog(@"FMDB Error %d: %@", [fmDatabase lastErrorCode], [fmDatabase lastErrorMessage]); } // 取出查询的结果集 while ([resultSet next]) { HCVideoInfo *video = [[HCVideoInfo alloc] init]; video.videoid = [resultSet stringForColumn:@"videoid"]; video.videoname = [resultSet stringForColumn:@"videoname"]; video.info = [resultSet stringForColumn:@"info"]; video.coverfilename = [resultSet stringForColumn:@"coverfilename"]; video.urlpath = [resultSet stringForColumn:@"urlpath"]; [videoArray addObject:video]; } videoListArray(videoArray); [resultSet close]; }]; } /** * 删除某条信息 */ -(BOOL)deleteVideoInfoFromVideoDB:(HCVideoInfo *)videoInfo{ NSString *deleteSql = [NSString stringWithFormat: @"delete from %@ where videoid = '%@'", kHCDBTableUser, videoInfo.videoid]; BOOL res = [self executeUpdate:deleteSql]; return res; } /** * 清空表(但不清除表结构) * * @return 操作结果 */ - (BOOL)truncateTable { return [self executeUpdate:[NSString stringWithFormat:@"DELETE FROM '%@'", kHCDBTableUser]]; } /** * 清空表(同时清除表结构) * * @return 操作结果 */ - (BOOL)dropTable { return [self executeUpdate:[NSString stringWithFormat:@"DROP TABLE '%@'", kHCDBTableUser]]; } /** * 执行一个更新语句 * * @param sql 更新语句的sql * * @return 更新语句的执行结果 */ - (BOOL)executeUpdate:(NSString *)sql{ __block BOOL updateRes = NO; [self.queue inDatabase:^(FMDatabase *db) { updateRes = [db executeUpdate:sql]; }]; return updateRes; } // 关闭游客 db -(void)closeVideoDB{ [self.queue inDatabase:^(FMDatabase* fmDatabase) { if ([fmDatabase close]) { NSLog(@"close MYVIDEO succes ...."); } else { NSLog(@"close MYVIDEO error"); } }]; [self.queue close]; self.queue = nil; _sharedManager = nil; } @end

    转载请注明原文地址: https://ju.6miu.com/read-19462.html

    最新回复(0)