·您现在的位置: 云翼网络 >> 文章中心 >> 网站建设 >> app软件开发 >> IOS开发 >> iOSsqlite增删改查简单封装(基于FMDB)

iOSsqlite增删改查简单封装(基于FMDB)

作者:佚名      IOS开发编辑:admin      更新时间:2022-07-23

/**
 *  对 sqlite 的使用进行简单封装,仅涉及简单的单表 增删改查
 *
 *  基于 FMDB
 *
 *  操作基于 model ,数据库表字段与 model 属性一一对应,对 model 整体进行操作
 *
 *  根据 model 对象自动建表,字段类型只支持 NSString , NSIteger , float
 *
 *  用到 runtime 运行时获取 model 属性
 *
 */

  1 //
  2 //  AGDatabaseManager.h
  3 //
  4 //  Created by Ager on 15/11/10.
  5 //  Copyright © 2015年 Ager. All rights reserved.
  6 //
  7 
  8 
  9 /**
 10  *  对 sqlite 的使用进行简单封装,仅涉及简单的单表 增删改查
 11  *
 12  *  基于 FMDB
 13  *
 14  *  操作基于 model ,数据库表字段与 model 属性一一对应,对 model 整体进行操作
 15  *
 16  *  根据 model 对象自动建表,字段类型只支持 NSString , NSIteger , float
 17  *
 18  *  用到 runtime 运行时获取 model 属性
 19  *
 20  */
 21 
 22 #import <Foundation/Foundation.h>
 23 
 24 @interface AGDatabaseManager : NSObject
 25 
 26 + (AGDatabaseManager*)shareAGDatabaseManager;
 27 
 28 /**
 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*)keyName PRimaryKey:(NSString*) key;
 39 
 40 
 41 /**
 42  *  向表格插入数据
 43  *
 44  *  @param model  数据模型与数据库表格对应
 45  *  @param tbName 要操作的表名
 46  *
 47  *  @return 添加是否成功
 48  */
 49 - (BOOL)insert:(id)model tableName:(NSString*)tbName;
 50 
 51 
 52 /**
 53  *  更新数据
 54  *
 55  *  @param tbName 要操作的表名
 56  *  @param model 数据模型与数据库表格对应
 57  *  @param str   更新操作查要更新的数据的条件
 58  *
 59  *  @return 更新是否成功
 60  */
 61 - (BOOL)update:(id)model tableName:(NSString*)tbName where:(NSString*)str;
 62 
 63 
 64 /**
 65  *  删除数据
 66  *
 67  *  @param tbName 要删除数据的表名
 68  *  @param str    要删除的数据的查找条件
 69  *
 70  *  @return 删除是否成功
 71  */
 72 - (BOOL)deleteTableName:(NSString*)tbName where:(NSString*)str;
 73 
 74 
 75 /**
 76  *  查询数据
 77  *
 78  *  @param model  数据模型与数据库表格对应
 79  *  @param tbName 要操作的表名
 80  *  @param str    删除操作查要删除的数据的条件
 81  *
 82  *  @return 查询结果 (数组每一项为字典)
 83  */
 84 - (NSArray*)select:(Class)model tableName:(NSString*)tbName where:(NSString*)str;
 85 
 86 
 87 /**
 88  *  查询全部数据
 89  *
 90  *  @param model  数据模型与数据库表格对应
 91  *  @param tbName 要操作的表名
 92  *
 93  *  @return 查询结果 (数组每一项为字典)
 94  */
 95 - (NSArray*)selectALL:(Class)model tableName:(NSString*)tbName;
 96 
 97 
 98 
 99 
100 @end
AGDatabaseManager.h
  1 //
  2 //  AGDatabaseManager.m
  3 //
  4 //  Created by Ager on 15/11/10.
  5 //  Copyright © 2015年 Ager. All rights reserved.
  6 //
  7 
  8 #import "AGDatabaseManager.h"
  9 #import "FMDatabase.h"
 10 #import <objc/runtime.h>
 11 
 12 static FMDatabase *fmdb = nil;
 13 
 14 @implementation AGDatabaseManager
 15 
 16 
 17 - (instancetype)init{
 18     if (self = [super init]) {
 19         
 20         static dispatch_once_t oneToken;
 21         dispatch_once(&oneToken, ^{
 22             NSString *document = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES)[0];
 23             NSString *filePath = [document stringByAppendingPathComponent:@"database.sqlite"];
 24             NSLog(@"%@",document);
 25             fmdb = [FMDatabase databaseWithPath:filePath];
 26 
 27         });
 28     }
 29     return self;
 30 }
 31 
 32 
 33 + (AGDatabaseManager*)shareAGDatabaseManager{
 34     return [[AGDatabaseManager alloc]init];
 35 }
 36 
 37 
 38 - (BOOL)creatTable:(Class)cls tableName:(NSString*)tbName keyName:(NSString*)keyName primaryKey:(NSString*) key{
 39     
 40     NSArray *array = [self getModelAllProperty:cls];
 41     NSMutableString *sql = [NSMutableString stringWithFormat:@"CREATE TABLE IF NOT EXISTS %@ (",tbName];
 42     
 43     for (int i = 0; i < array.count; i++) {
 44         NSDictionary *dic = array[i];
 45         [sql appendFormat:@"%@  %@ ",[dic objectForKey:@"name"],[dic objectForKey:@"type"]];
 46         if(keyName != nil && [keyName isEqualToString:[dic objectForKey:@"name"]]){
 47             [sql appendString:key];
 48         }
 49         if (i < array.count - 1){
 50             [sql appendString:@","];
 51         }
 52     }
 53     
 54     [sql appendString:@")"];
 55     
 56     NSLog(@"创建表格: %@",sql);
 57     
 58     [fmdb open];
 59     BOOL result = [fmdb executeUpdate:[sql copy]];
 60     NSLog(@"创建表格:%@",result ? @"成功":@"失败");
 61     [fmdb close];
 62     return result;
 63 }
 64 
 65 
 66 - (BOOL)insert:(id)model tableName:(NSString*)tbName{
 67     
 68     NSArray *array = [self getModelAllProperty:[model class]];
 69     
 70     NSMutableString *propertyStr = [[NSMutableString alloc]init];
 71     NSMutableString *valuesStr = [[NSMutableString alloc]init];
 72     
 73     for (int i = 0; i < array.count; i++) {
 74         NSDictionary *dic = array[i];
 75         [propertyStr appendString:[dic objectForKey:@"name"]];
 76         [valuesStr appendFormat:@"'%@'",[model valueForKey:[dic objectForKey:@"name"]]];
 77         
 78         if (i < array.count - 1){
 79             [propertyStr appendString:@","];
 80             [valuesStr appendString:@","];
 81         }
 82     }
 83     NSMutableString *sql = [NSMutableString stringWithFormat:@"INSERT INTO %@ (%@) values (%@)",tbName,propertyStr ,valuesStr];
 84     NSLog(@"添加数据 : %@",sql);
 85     [fmdb open];
 86     BOOL result = [fmdb executeUpdate:[sql copy]];
 87     [fmdb close];
 88      NSLog(@"添加数据:%@",result ? @"成功":@"失败");
 89     
 90     return result;
 91 }
 92 
 93 
 94 - (BOOL)update:(id)model tableName:(NSString*)tbName where:(NSString*)str{
 95     NSArray *array = [self getModelAllProperty:[model class]];
 96     NSMutableString *sql = [NSMutableString stringWithFormat:@"UPDATE %@ SET ",tbName];
 97     
 98     for (int i = 0; i < array.count; i++) {
 99         NSDictionary *dic = array[i];
100         NSString *pro = [dic objectForKey:@"name"];
101         [sql appendFormat:@"%@ = '%@'",pro,[model valueForKey:pro]];
102         if (i < array.count - 1){
103             [sql appendString:@","];
104         }
105     }
106     
107     [sql appendFormat:@" where %@",str];
108     
109     NSLog(@"修改数据 : %@",sql);
110     [fmdb open];
111     BOOL result = [fmdb executeUpdate:[sql copy]];
112     [fmdb close];
113     NSLog(@"更新数据:%@",result ? @"成功":@"失败");
114     return result;
115 }
116 
117 
118 - (BOOL)deleteTableName:(NSString*)tbName where:(NSString*)str{
119     NSString *sql = [NSString stringWithFormat:@"delete from %@ where %@",tbName,str];
120     NSLog(@"删除数据 : %@",sql);
121     [fmdb open];
122     BOOL result = [fmdb executeUpdate:sql];
123     [fmdb close];
124     NSLog(@"更新数据:%@",result ? @"成功":@"失败");
125     return result;
126 }
127 
128 
129 - (NSArray*)select:(Class)model tableName:(NSString*)tbName where:(NSString*)str{
130     NSString *sql = [NSString stringWithFormat:@"select * from %@ where %@",tbName,str];
131     NSArray *array = [self getModelAllProperty:[model class]];
132     [fmdb open];
133     NSLog(@"查询数据 : %@",sql);
134     FMResultSet *set = [fmdb executeQuery:sql];
135     NSMutableArray *allArray = [[NSMutableArray alloc]init];
136     while ([set next]) {
137         NSMutableDictionary *dic = [[NSMutableDictionary alloc]init];
138         for (int i = 0; i < array.count; i++) {
139             NSDictionary *dic1 = array[i];
140             NSString *pro = [dic1 objectForKey:@"name"];
141             [dic setValue:[set stringForColumn:pro] forKey:pro];
142         }
143         [allArray addObject:dic];
144     }
145     
146     [set close];
147     [fmdb close];
148     return [allArray copy];
149 }
150 
151 - (NSArray*)selectALL:(Class)model tableName:(NSString*)tbName {
152     NSString *sql = [NSString stringWithFormat:@"select * from %@ ",tbName];
153     NSArray *array = [self getModelAllProperty:[model class]];
154     [fmdb open];
155     NSLog(@"查询数据 : %@",sql);
156     FMResultSet *set = [fmdb executeQuery:sql];
157     NSMutableArray *allArray = [[NSMutableArray alloc]init];
158     while ([set next]) {
159         NSMutableDictionary *dic = [[NSMutableDictionary alloc]init];
160         for (int i = 0; i < array.count; i++) {
161             NSDictionary *dic1 = array[i];
162             NSString *pro = [dic1 objectForKey:@"name"];
163             [dic setValue:[set stringForColumn:pro] forKey:pro];
164         }
165         [allArray addObject:dic];
166     }
167     
168     [set close];
169     [fmdb close];
170     return [allArray copy];
171 }
172 
173 
174 
175 
176 #pragma mark --- 辅助方法 ---
177 
178 /**
179  *  获取 model 类全部的属性和属性类型
180  *
181  *  @param cls model 类 class
182  *
183  *  @return 返回 model 的属性和属性类型
184  */
185 - (NSArray *)getModelAllProperty:(Class)cls{
186     
187     unsigned int count = 0;
188     objc_property_t *propertys = class_copyPropertyList(cls, &count);
189     NSMutableArray *array = [NSMutableArray array];
190     for (int i = 0; i < count; i++) {
191         
192         objc_property_t property = propertys[i];
193         NSString *propertyName = [NSString stringWithCString:property_getName(property) encoding:NSUTF8StringEncoding];
194         
195         NSString *type = [self getPropertyAttributeValue:property name:@"T"];
196         
197         if ([type isEqualToString:@"q"]||[type isEqualToString:@"i"]) {
198             type = @"INTEGER";
199         }else if([type isEqualToString:@"f"] || [type isEqualToString:@"d"]){
200             type = @"FLOAT";
201         }else{
202             type = @"TEXT";
203         }
204                
205         NSDictionary *dic = [NSDictionary dictionaryWithObjectsAndKeys:propertyName , @"name",type , @"type", nil];
206         
207         [array addObject:dic];
208         
209     }
210     free(propertys);
211     
212     return array.copy;
213 }
214 
215 /**
216  *  获取属性的特征值
217  */
218 
219 - (NSString*)getPropertyAttributeValue:(objc_property_t) pro name:(NSString*)name{
220     
221     unsigned int count = 0;
222     objc_property_attribute_t *attributes = property_copyAttributeList(pro, &count);
223     
224     for (int i = 0 ; i < count; i++) {
225         objc_property_attribute_t attribute = attributes[i];
226         if (strcmp(attribute.name, name.UTF8String) == 0) {
227             return [NSString stringWithCString:attribute.value encoding:NSUTF8StringEncoding];
228         }
229     }
230     free(attributes);
231     return nil;
232 }
233 
234 @end
AGDatabaseManager.m

FMDB + AGDatabaseManager 文件