/**
* 对 sqlite 的使用进行简单封装,仅涉及简单的单表 增删改查
*
* 基于 FMDB
*
* 操作基于 model ,数据库表字段与 model 属性一一对应,对 model 整体进行操作
*
* 根据 model 对象自动建表,字段类型只支持 NSString , NSIteger , float
*
* 用到 runtime 运行时获取 model 属性
*
*/
1//2//AGDatabaseManager.h3//4//Created by Ager on 15/11/10.5//Copyright © 2015年 Ager. All rights reserved.6//789/**10* 对 sqlite 的使用进行简单封装,仅涉及简单的单表 增删改查11*12* 基于 FMDB13*14* 操作基于 model ,数据库表字段与 model 属性一一对应,对 model 整体进行操作15*16* 根据 model 对象自动建表,字段类型只支持 NSString , NSIteger , float17*18* 用到 runtime 运行时获取 model 属性19*20*/2122#import<Foundation/Foundation.h>2324@interfaceAGDatabaseManager : NSObject2526+ (AGDatabaseManager*)shareAGDatabaseManager;2728/**29* 创建表格30*31* @param cls model 类32* @param tbName 表名33* @param keyName 主键字段34* @param key 主键的属性设置35*36* @return 创建表格是否成功37*/38- (BOOL)creatTable:(Class)cls tableName:(NSString*)tbName keyName:(NSString*)keyNamePRimaryKey:(NSString*) key;394041/**42* 向表格插入数据43*44* @param model 数据模型与数据库表格对应45* @param tbName 要操作的表名46*47* @return 添加是否成功48*/49- (BOOL)insert:(id)model tableName:(NSString*)tbName;505152/**53* 更新数据54*55* @param tbName 要操作的表名56* @param model 数据模型与数据库表格对应57* @param str 更新操作查要更新的数据的条件58*59* @return 更新是否成功60*/61- (BOOL)update:(id)model tableName:(NSString*)tbNamewhere:(NSString*)str;626364/**65* 删除数据66*67* @param tbName 要删除数据的表名68* @param str 要删除的数据的查找条件69*70* @return 删除是否成功71*/72- (BOOL)deleteTableName:(NSString*)tbNamewhere:(NSString*)str;737475/**76* 查询数据77*78* @param model 数据模型与数据库表格对应79* @param tbName 要操作的表名80* @param str 删除操作查要删除的数据的条件81*82* @return 查询结果 (数组每一项为字典)83*/84- (NSArray*)select:(Class)model tableName:(NSString*)tbNamewhere:(NSString*)str;858687/**88* 查询全部数据89*90* @param model 数据模型与数据库表格对应91* @param tbName 要操作的表名92*93* @return 查询结果 (数组每一项为字典)94*/95- (NSArray*)selectALL:(Class)model tableName:(NSString*)tbName;96979899100@end
AGDatabaseManager.h
1//2//AGDatabaseManager.m3//4//Created by Ager on 15/11/10.5//Copyright © 2015年 Ager. All rights reserved.6//78#import"AGDatabaseManager.h"9#import"FMDatabase.h"10#import<objc/runtime.h>1112staticFMDatabase *fmdb =nil;1314@implementationAGDatabaseManager151617-(instancetype)init{18if(self =[super init]) {1920staticdispatch_once_t oneToken;21dispatch_once(&oneToken, ^{22NSString *document = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES)[0];23NSString *filePath = [document stringByAppendingPathComponent:@"database.sqlite"];24NSLog(@"%@",document);25fmdb =[FMDatabase databaseWithPath:filePath];2627});28}29returnself;30}313233+ (AGDatabaseManager*)shareAGDatabaseManager{34return[[AGDatabaseManager alloc]init];35}363738- (BOOL)creatTable:(Class)cls tableName:(NSString*)tbName keyName:(NSString*)keyName primaryKey:(NSString*) key{3940NSArray *array =[self getModelAllProperty:cls];41NSMutableString *sql = [NSMutableString stringWithFormat:@"CREATE TABLE IF NOT EXISTS %@ (",tbName];4243for(inti =0; i < array.count; i++) {44NSDictionary *dic =array[i];45[sql appendFormat:@"%@ %@",[dic objectForKey:@"name"],[dic objectForKey:@"type"]];46if(keyName != nil && [keyName isEqualToString:[dic objectForKey:@"name"]]){47[sql appendString:key];48}49if(i < array.count -1){50[sql appendString:@","];51}52}5354[sql appendString:@")"];5556NSLog(@"创建表格: %@",sql);5758[fmdb open];59BOOL result =[fmdb executeUpdate:[sql copy]];60NSLog(@"创建表格:%@",result ?@"成功":@"失败");61[fmdb close];62returnresult;63}646566- (BOOL)insert:(id)model tableName:(NSString*)tbName{6768NSArray *array = [self getModelAllProperty:[modelclass]];6970NSMutableString *propertyStr =[[NSMutableString alloc]init];71NSMutableString *valuesStr =[[NSMutableString alloc]init];7273for(inti =0; i < array.count; i++) {74NSDictionary *dic =array[i];75[propertyStr appendString:[dic objectForKey:@"name"]];76[valuesStr appendFormat:@"'%@'",[model valueForKey:[dic objectForKey:@"name"]]];7778if(i < array.count -1){79[propertyStr appendString:@","];80[valuesStr appendString:@","];81}82}83NSMutableString *sql = [NSMutableString stringWithFormat:@"INSERT INTO %@ (%@) values (%@)",tbName,propertyStr ,valuesStr];84NSLog(@"添加数据 : %@",sql);85[fmdb open];86BOOL result =[fmdb executeUpdate:[sql copy]];87[fmdb close];88NSLog(@"添加数据:%@",result ?@"成功":@"失败");8990returnresult;91}929394- (BOOL)update:(id)model tableName:(NSString*)tbNamewhere:(NSString*)str{95NSArray *array = [self getModelAllProperty:[modelclass]];96NSMutableString *sql = [NSMutableString stringWithFormat:@"UPDATE %@ SET",tbName];9798for(inti =0; i < array.count; i++) {99NSDictionary *dic =array[i];100NSString *pro = [dic objectForKey:@"name"];101[sql appendFormat:@"%@ = '%@'",pro,[model valueForKey:pro]];102if(i < array.count -1){103[sql appendString:@","];104}105}106107[sql appendFormat:@"where %@",str];108109NSLog(@"修改数据 : %@",sql);110[fmdb open];111BOOL result =[fmdb executeUpdate:[sql copy]];112[fmdb close];113NSLog(@"更新数据:%@",result ?@"成功":@"失败");114returnresult;115}116117118- (BOOL)deleteTableName:(NSString*)tbNamewhere:(NSString*)str{119NSString *sql = [NSString stringWithFormat:@"delete from %@ where %@",tbName,str];120NSLog(@"删除数据 : %@",sql);121[fmdb open];122BOOL result =[fmdb executeUpdate:sql];123[fmdb close];124NSLog(@"更新数据:%@",result ?@"成功":@"失败");125returnresult;126}127128129- (NSArray*)select:(Class)model tableName:(NSString*)tbNamewhere:(NSString*)str{130NSString *sql = [NSString stringWithFormat:@"select * from %@ where %@",tbName,str];131NSArray *array = [self getModelAllProperty:[modelclass]];132[fmdb open];133NSLog(@"查询数据 : %@",sql);134FMResultSet *set=[fmdb executeQuery:sql];135NSMutableArray *allArray =[[NSMutableArray alloc]init];136while([setnext]) {137NSMutableDictionary *dic =[[NSMutableDictionary alloc]init];138for(inti =0; i < array.count; i++) {139NSDictionary *dic1 =array[i];140NSString *pro = [dic1 objectForKey:@"name"];141[dic setValue:[setstringForColumn:pro] forKey:pro];142}143[allArray addObject:dic];144}145146[setclose];147[fmdb close];148return[allArray copy];149}150151- (NSArray*)selectALL:(Class)model tableName:(NSString*)tbName {152NSString *sql = [NSString stringWithFormat:@"select * from %@",tbName];153NSArray *array = [self getModelAllProperty:[modelclass]];154[fmdb open];155NSLog(@"查询数据 : %@",sql);156FMResultSet *set=[fmdb executeQuery:sql];157NSMutableArray *allArray =[[NSMutableArray alloc]init];158while([setnext]) {159NSMutableDictionary *dic =[[NSMutableDictionary alloc]init];160for(inti =0; i < array.count; i++) {161NSDictionary *dic1 =array[i];162NSString *pro = [dic1 objectForKey:@"name"];163[dic setValue:[setstringForColumn:pro] forKey:pro];164}165[allArray addObject:dic];166}167168[setclose];169[fmdb close];170return[allArray copy];171}172173174175176#pragmamark --- 辅助方法 ---177178/**179* 获取 model 类全部的属性和属性类型180*181* @param cls model 类 class182*183* @return 返回 model 的属性和属性类型184*/185- (NSArray *)getModelAllProperty:(Class)cls{186187unsignedintcount =0;188objc_property_t *propertys = class_copyPropertyList(cls, &count);189NSMutableArray *array =[NSMutableArray array];190for(inti =0; i < count; i++) {191192objc_property_t property =propertys[i];193NSString *propertyName =[NSString stringWithCString:property_getName(property) encoding:NSUTF8StringEncoding];194195NSString *type = [self getPropertyAttributeValue:property name:@"T"];196197if([type isEqualToString:@"q"]||[type isEqualToString:@"i"]) {198type =@"INTEGER";199}elseif([type isEqualToString:@"f"] || [type isEqualToString:@"d"]){200type =@"FLOAT";201}else{202type =@"TEXT";203}204205NSDictionary *dic = [NSDictionary dictionaryWithObjectsAndKeys:propertyName ,@"name",type ,@"type", nil];206207[array addObject:dic];208209}210free(propertys);211212returnarray.copy;213}214215/**216* 获取属性的特征值217*/218219- (NSString*)getPropertyAttributeValue:(objc_property_t) pro name:(NSString*)name{220221unsignedintcount =0;222objc_property_attribute_t *attributes = property_copyAttributeList(pro, &count);223224for(inti =0; i < count; i++) {225objc_property_attribute_t attribute =attributes[i];226if(strcmp(attribute.name, name.UTF8String) ==0) {227return[NSString stringWithCString:attribute.value encoding:NSUTF8StringEncoding];228}229}230free(attributes);231returnnil;232}233234@end
AGDatabaseManager.m
FMDB + AGDatabaseManager 文件