三、面向对象的sqlite数据库操作框架封装
网上不乏有许多优秀的第三方sqlite数据库使用框架,FFDM就是其中之一,并且apple自带的coreData也十分优秀。这篇博客中所述内容并不全面,代码也并不十分完善健壮,封装出来的代码除了能够完成基本的数据库操作外,更多主要是对设计思路的示例。
1.面向对象的sqlite管理类的设计思路
为了便于使用,在设计时,我们尽量将libsqlite3中的方法不暴漏在使用层,通过面向应用的接口来进行方法的设计,设计思路类图如下:
图中,文件管理中心对文件进行存取删改管理,不暴漏在外,数据库管理中心负责对数据库的创建,删除打开等操作,具体的数据操作由数据库操作对象来完成。
2.文件管理中心方法的编写
文件管理中心主要负责对数据库文件的存取,可以实现如下方法:
YHBaseCecheCenter.h
/**
* @brief 获取数据库方法的地址
*
* @return 地址字符串
*
*/
-(NSString *)getDataBaseFilePath;
/**
* @brief 获取某个数据库的大小
*
* @param name 数据库名称
*
* @return 文件大小 单位M
*
*/
-(float)getSizeFromDataBaseName:(NSString *)name;
YHBaseCecheCenter.m
-(NSString *)getDataBaseFilePath{
return NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).firstObject;
}
-(float)getSizeFromDataBaseName:(NSString *)name{
NSString * path = [NSString stringWithFormat:@"/%@/%@",NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).firstObject,name];
return [self fileSizeAtPath:path]/(1024.0*1024.0);
}
//获取文件大小
- (long long) fileSizeAtPath:(NSString*) filePath{
NSFileManager* manager = [NSFileManager defaultManager];
if ([manager fileExistsAtPath:filePath]){
return [[manager attributesOfItemAtPath:filePath error:nil] fileSize];
}
return 0;
}
在iOS系统中因为其沙盒结构的限制,数据库必须方法documents目录下才能正常打开使用。
3.数据库管理中心的设计
数据库管理中心主要负责对数据库的宏观操作,采用类方法的设计模式,如下
YHBaseSQLiteManager.h
/**
* @brief 打开一个数据库 如果不存在则会创建
*
* @param name 数据库名称
*
* @return 数据库操作对象 如果创建失败会返回nil
*
*/
+(YHBaseSQLiteContext *)openSQLiteWithName:(NSString *)name;
/**
* @brief 获取数据库文件的大小 单位M
*
* @param dataBase 数据库上下文对象
*
* @return 数据库文件大小
*/
+(float)getSizeOfDataBase:(YHBaseSQLiteContext *)dataBase;
/**
* @brief 获取数据库文件的大小 单位M
*
* @param dataBaseName 数据库名称
*
* @return 数据库文件大小
*/
+(float)getSizeOfDataBaseName:(NSString *)dataBaseName;
/**
* @brief 删除所有数据库
*
*/
+(void)removeDataBase;
YHBaseSQLiteManager.m
+(YHBaseSQLiteContext *)openSQLiteWithName:(NSString *)name{
NSString * path = [[YHBaseCecheCenter sharedTheSingletion]getDataBaseFilePath];
YHBaseSQLiteContext * context = [[YHBaseSQLiteContext alloc]init];
context.name = name;
BOOL success = [context openDataBaeWithName:[NSString stringWithFormat:@"%@/%@",path,name]];
if (success) {
return context;
}else{
return nil;
}
}
+(float)getSizeOfDataBase:(YHBaseSQLiteContext *)dataBase{
return [[YHBaseCecheCenter sharedTheSingletion]getSizeFromDataBaseName:dataBase.name];
}
+(float)getSizeOfDataBaseName:(NSString *)dataBaseName{
return [[YHBaseCecheCenter sharedTheSingletion]getSizeFromDataBaseName:dataBaseName];
}
+(void)removeDataBase{
NSString * path = [[YHBaseCecheCenter sharedTheSingletion]getDataBaseFilePath];
return [[YHBaseCecheCenter sharedTheSingletion]removeCacheFromPath:path];
}