zoukankan      html  css  js  c++  java
  • iOS sqlite 增删改查 简单封装(基于 FMDB)

    /**
     *  对 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 文件

     

  • 相关阅读:
    project3 blockchain
    RESTful Web服务与“大”Web服务: 做出正确的建筑决策
    project2
    LAB4
    云计算的描述性文献综述与分类研究
    SQL常见面试题(学生表_课程表_成绩表_教师表)
    等价类划分经典实例-三角形测试用例设计
    搜索框功能测试分析
    B/S结构-登录页面-测试用例设计
    软件测试面试--常用基本控件测试用例
  • 原文地址:https://www.cnblogs.com/Ager/p/4954800.html
Copyright © 2011-2022 走看看