面向模型,FMDB二次封装版

作者:计算机知识

摩登针对 FMDatabaseQueue封装 假如您须求八线程管理数据库,用这些就轻易管理

局地FMDB封装框架功用超级多,代码量也正如大,不过众多效率不时用,因此自行封装三个适用于手头项指标轻量级小框架。
因为品种要求在三十多线程下操作数据库,所以只根据FMDatabaseQueue举办了打包。

MVC

在Model中创建BLL和DAL

  • BLL--业务逻辑层
  • DAL--数据访谈层

对于数据的拍卖全归入数据访谈层DAL,业务逻辑层BLL只是对艺术的调用,而在主函数中是工作逻辑层BLL的艺术的调用。
BLL相当于是主持,让DAL实际去得以达成多少的管理

选择FMDB来开展多少的蕴藏封装方法

  • 引入sqlite3的框架
  • 面向模型,FMDB二次封装版。把FMDB的文本作为第三方copy进来
  • 对FMDB进行叁次封装fmdbHelper
#import <Foundation/Foundation.h>
#import "FMDB.h"

@interface FmdbHelper : NSObject

@property (nonatomic, strong) FMDatabase *db;

//单例的类方法
 (instancetype)fmdbHelper;

//执行更新(除了查询以外的方法)
- (BOOL)executeUpdate:(NSString*)sql withArgumentsInArray:(NSArray *)arguments;

//查询
-(void)executeQuery:(NSString *)sql withArgumentsInArray:(NSArray *)
arguments andReslutBlock:(void(^)(FMResultSet *set))block;

@end

#import "FmdbHelper.h"

@implementation FmdbHelper

//单例的类方法
 (instancetype)fmdbHelper{
    static FmdbHelper *instance;
    static dispatch_once_t predicate;
    dispatch_once(&predicate, ^{
        instance = [[FmdbHelper alloc] init];

        //db属性初始化
        //数据库文件的路径
        NSString *documentPath = [NSSearchPathForDirectoriesInDomains
(NSDocumentDirectory, NSUserDomainMask, YES) firstObject];
        NSString *dbPath = [documentPath stringByAppendingPath
Component:@"temp.db"];
        NSLog(@"dbPath %@", dbPath);
        //初始化对象
        instance.db = [[FMDatabase alloc] initWithPath:dbPath];
    });
    return instance;
}

//执行更新(除了查询以外的方法)
- (BOOL)executeUpdate:(NSString*)sql withArgumentsInArray:(NSArray *)
arguments{
    //打开数据库
    if ([_db open]) {
        //执行更新
        BOOL res = [_db executeUpdate:sql withArgumentsInArray:
arguments];
        //关闭数据库
        [_db close];
        return res;
    }
    return NO;
}

//查询
-(void)executeQuery:(NSString *)sql withArgumentsInArray:(NSArray *)
arguments andReslutBlock:(void(^)(FMResultSet *set))block{
    //打开数据库
    if ([_db open]) {
        //执行查询
        FMResultSet *set = [_db executeQuery:sql withArgumentsInArray:
arguments];
        //遍历结果
        block(set);
        //关闭数据库
        [_db close];
    }
}

@end
  • 在DAL中展开数量的操作
  • 在DAL中要先创建sql语句
  • 执行sql语句

LKFMDB

德姆o下载地址 gitHub
最棒是在github上看上面有详尽介绍,不断更新纠正问题。
FMDB面向对象封装,帮忙自便等级次序主键,可对各种字段修饰,二货式操作,一键就能够保存更新。

FMDB是OC的措施封装了SQLite的C语言API,而且它对于三十四线程的现身操作实行了拍卖,所以是线程安全的;相对系统提供的CoreData,轻量比较多,使用起来也很有利,除查询以外的具备操作,都称得上“更新”,这里就不详细介绍了,不是本文的主旨

https://github.com/huixinHu/HXDB

如何运用

  1. 先是保证您的程序导入过FMDB
  2. 导入文本LKFMDB
  3. 是或不是须求加密,没有必要不用导入SQLCipher,上面会介绍如何加密。
  4. 对亟待创设数据库的类世袭LKDBModel
  • ##### FMDB gitHub地址
  • FMDB轻便三遍封装
  • 线程安全
  • 支撑工作操作
  • 帮忙模型存款和储蓄,但不援救集合类型、自定义类类型属性等等。(扶植NSString、NSNumber、NSInteger 、BOOL、int、float、 double、NSData等简易类型属性)

支持SQLCipher加密

切实请看对FMDB加密-SQLCipher怎样使用
默感觉加密方式
如须求撤除在FMDB文件下FMDatabase.m文件下

//注释掉低150行和177行代码
else{
[self setKey:DB_SECRETKEY];
}

1.数据库的创导

  (instancetype)shareDB;

  (instancetype)shareDB:(NSString *)dbName;

  (instancetype)shareDB:(NSString *)dbName dbPath:(NSString *)dbpath;

多个单例方法,dbName为数量库名,参数假若为nil,那么就能创立二个名叫XiaoYa.sqlite的数据库文件;假如dbpath 为子路线名,若参数为nil,那么就暗中同意在NSDocumentDirectory下创办数据库文件。如利用shareDB艺术创建,则默许在NSDocumentDirectory下创办XiaoYa.sqlite。
接收那八个格局中大肆三个创办数据库,之后再使用四个方法中放肆三个都会会的同一个实例。

@property (nonatomic ,strong) HXDBManager *hxdb;

self.hxdb = [HXDBManager shareDB];
self.hxdb = [HXDBManager shareDB:@"HXDB.sqlite"];
//在hxDataBasePath/hxDataBasePath路径下创建HXDB.sqlite
self.hxdb = [HXDBManager shareDB:@"HXDB.sqlite" dbPath:@"hxDataBasePath"];

骨干模块介绍

  • LKDBTool 创建单例对数据库操作
  • LKDBModel 主旨业务模块 对FMDB封装。 主题模块runtime 对质量的得到,上边会对基本代码讲明。
  • LKDBColumnDes 字段修饰模块 对字段修饰
  • LKDBSQLState sql语句封装模块 -------------正在对此模块封装中......
  • 1、隔开互连网第三方框架,方便订正维护

  • 2、即使FMDB已经封装了SQLite,但照旧要求写SQL语句,对于模型中属性非常多以来,拼接SQL语句将变得老大累赘;何况对于字符串、词典、数组数据是不能直接存入数据库,要求非常处理。

2.切换数据库

虚构到有客户退出登入、切换来另叁个客户账号的情状,每三个客商要求单独一份数据,所以需求切换数据库。

- (void)changeFilePath:(NSString *)path dbName:(NSString *)dbName;

path参数是文件子路线,dbName是数码库名。

[self.hxdb changeFilePath:[Utils HXNSStringMD5:appDelegate.userid] dbName:@"XiaoYa.sqlite"];

常用方法介绍 - 具体查看德姆o

故而封装面向模型,只必要传入对应的模型新闻就能够实行数据库操作,无需写任何SQL语句,屏蔽内部有着操作,插入什么模型,就抽取什么模型,轻松易用!相同的时候为了确定保证传入的都以模型数据,增多了特别提醒,对传播的模子做了约束,必需是NSObject也许NSObject的子类,同不常候不响应事件

3.创建表

方法1:依照sql语句成立表

/**
根据sql语句创建表

 @param sql SQL语句
 @param tableName 表名
 @return 创建表是否成功
 */
- (BOOL)tableCreate:(NSString *)sql table:(NSString *)tableName;

[self.hxdb tableCreate:@"CREATE TABLE IF NOT EXISTS memberGroupRelation (memberId TEXT,groupId TEXT, FOREIGN KEY(groupId) REFERENCES groupTable(groupId) ON DELETE CASCADE);" table:@"memberGroupRelation"];

主意2:遵照词典创立表
词典key:字段名,辞典value:字段类型。能够钦点主键字段名,假诺不需求主键 pk 参数字传送入nil就可以。

/**
 根据字典创建表

 @param tableName 表名
 @param dict 字典,key 字段名、value 字段类型
 @param pk 主键,可为nil
 @return 是否成功
 */
- (BOOL)createTable:(NSString *)tableName colDict:(NSDictionary *)dict primaryKey:(NSString *)pk;

[self.hxdb createTable:groupTable colDict:@{@"groupId":@"TEXT",@"groupName":@"TEXT",@"groupAvatarId":@"TEXT",@"numberOfMember":@"TEXT",@"groupManagerId":@"TEXT",@"deleteFlag":@"INTEGER"} primaryKey:@"groupId"];

艺术3:依照模型创设表,字段名正是对应模型的属性名

/**
 根据模型类创建表

 @param tableName 表名
 @param cls 模型类
 @param pk 主键,可为nil
 @param colArr 模型中不需要作为表字段的属性
 @return 创建表是否成功
 */
- (BOOL)createTable:(NSString *)tableName modelClass:(Class)cls primaryKey:(NSString *)pk excludeProperty:(NSArray *)colArr;

模型类:
@interface Person : NSObject
@property (nonatomic, copy) NSString *name;
@property (nonatomic, strong) NSNumber *phone;
@property (nonatomic, strong) NSData *userData;
@property (nonatomic, assign) NSInteger identity;
@property (nonatomic, assign) BOOL sex;
@property (nonatomic, assign) int age;
@property (nonatomic, assign) float height;  //可能会丢失精度
@property (nonatomic, assign) double weight;

@property (nonatomic, strong)NSDictionary *testDic;

@end

创建表:
 [self.hxdb createTable:@"modelTable" modelClass:NSClassFromString(@"Person") primaryKey:@"identity" excludeProperty:nil];

要潜心,NSDictionary这种集结类型的性质不会作为表字段,除外还也可以有NSArray、NSSet等聚焦类型。

LKDBTool

/** 单列 操作数据库保证唯一*/
  (instancetype)shareInstance;
/**  数据库路径*/
  (NSString *)dbPath;
/**  切换数据库*/
- (BOOL)changeDBWithDirectoryName:(NSString *)directoryName;
  • 3、FMDB中操作实行非凡只会打字与印刷出来(举个例子未有对应表的时候的操作),如果项目中打字与印刷新闻超多的话,不轻便觉察。

4.删除表

/**
 删除表

 @param tableName 表名
 @param block 删除失败回调
 */
- (void)dropTable:(NSString *)tableName callback:(void(^)(NSError *error ))block;

[self.hxdb dropTable:@"modelTable" callback:^(NSError *error) {
        NSLog(@"error");
    }];

LKDBModel

#pragma mark 常用方法
/** 保存或更新
 * 如果不存在主键,保存,
 * 有主键,则更新
 */
- (BOOL)saveOrUpdate;
/** 保存单个数据 */
- (BOOL)save;
/** 批量保存数据 */
  (BOOL)saveObjects:(NSArray *)array;
/** 事物保存或跟新 */
 (BOOL)saveOrUpdateObjects:(NSArray *)array;
/** 更新单个数据 */
- (BOOL)update;
/** 批量更新数据*/
  (BOOL)updateObjects:(NSArray *)array;
/** 删除单个数据 */
- (BOOL)deleteObject;
/** 批量删除数据 */
  (BOOL)deleteObjects:(NSArray *)array;
/** 通过条件删除数据 */
  (BOOL)deleteObjectsByCriteria:(NSString *)criteria;
/** 通过条件删除  */
  (BOOL)deleteObjectsWithFormat:(NSString *)format, ...;
/** 清空表 */
  (BOOL)clearTable;
/** 查询全部数据 */
  (NSArray *)findAll;
/** 查找某条数据 */
  (instancetype)findFirstByCriteria:(NSString *)criteria;
/** 通过条件查找数据*/
  (NSArray *)findByCriteria:(NSString *)criteria;

//必须要重写的方法
/** 如果子类中有一些property不需要创建数据库字段,或者对字段加修饰属性 具体请参考LKDBColumnDes类*/
  (NSDictionary *)describeColumnDict;

之所以操作十一分时增添断言,正明确位操作非常地方甚至至极情状

5.0增加和删除改数据

一贯传入sql语句举行增加和删除查改

/**
 直接传入sql语句进行增删查改

 @param sql SQL语句
 @param block 回调
 */
- (void)updateWithSqlStat:(NSString *)sql callback:(void(^)(NSError *error ))block;
//批量版本
- (void)updateWithSqlStatInTransaction:(NSArray <NSString *> *)sqlArr callback:(void(^)(NSError *error))block;

LKDBColumnDes

/** 别名 */
@property (nonatomic, copy)  NSString *columnName;
/** 限制 */
@property (nonatomic, copy)  NSString *check;
/** 默认 */
@property (nonatomic, copy)  NSString *defaultValue;
/** 外键 */
@property (nonatomic, copy)  NSString *foreignKey;
/** 是否为主键 */
@property (nonatomic, assign, getter=isPrimaryKey)  BOOL      primaryKey;
/** 是否为唯一 */
@property (nonatomic, assign, getter=isUnique)  BOOL      unique;
/** 是否为不为空 */
@property (nonatomic, assign, getter=isNotNull)  BOOL      notNull;
/** 是否为自动升序 如何为text就不能自动升序 */
@property (nonatomic, assign, getter=isAutoincrement)  BOOL      autoincrement;
/** 此属性是否创建数据库字段 */
@property (nonatomic, assign, getter=isUseless) BOOL useless;
/**
 *  主键便利构造器
 */
- (instancetype)initWithAuto:(BOOL)isAutoincrement isNotNull:(BOOL)notNull check:(NSString *)check defaultVa:(NSString *)defaultValue;
/**
 *  一般字段便利构造器
 */
- (instancetype)initWithgeneralFieldWithAuto:(BOOL)isAutoincrement  unique:(BOOL)isUnique isNotNull:(BOOL)notNull check:(NSString *)check defaultVa:(NSString *)defaultValue;
/**
 *  外键构造器
 */
- (instancetype)initWithFKFiekdUnique:(BOOL)isUnique isNotNull:(BOOL)notNull check:(NSString *)check default:(NSString *)defaultValue foreignKey:(NSString *)foreignKey;
/**
 *  判断是否起别名
 */
- (BOOL)isCustomColumnName:(NSString *)attribiteName;
/**
 *  生成修饰语句
 */
- (NSString *)finishModify;
  • 4、对数据库操作后必要关闭数据库,那个时候增添了代码量,况包轻便忘记,内部存款和储蓄器不能够马上放出。

5.1插入数据

1.插入单个模型

/**
 插入单个模型

 @param tableName 表名
 @param model 模型对象
 @param colArr 模型中不需要插入到表的属性名集合
 @param block 回调
 */
- (void)insertTable:(NSString *)tableName model:(id)model excludeProperty:(NSArray *)colArr callback:(void(^)(NSError *error ))block;

Person *person = [[Person alloc] init];
    person.name = @"PersonName";
    person.phone = @(12345667890);
    person.userData = [@"testData" dataUsingEncoding:NSUTF8StringEncoding];
    person.identity = 60;
    person.sex = 1;
    person.age = 23;
    person.height = 170.1;
    person.weight = 233.33333;
    person.testDic = [NSDictionary dictionary];
//插入一个模型对象的数据,其中weight和height属性不需要被插入
    [self.hxdb insertTable:@"modelTable" model:person excludeProperty:@[@"height",@"weight"] callback:^(NSError *error) {
        NSLog(@"%@",error);
    }];

2.批量插入模型

/**
 批量插入模型

  @param tableName 表名
 @param modelArr 模型对象数组
 @param colArr 一一对应模型对象数组中的每一元素,模型对象中不需要插入到表的属性名集合。需要程序员自行管理一一对应的关系,如果某模型对象没有要剔除的属性,则对应的excludeArr为空数组即可;如果所有模型对象都不需要剔除某些属性,则excludeProperty传入nil即可。
 @param block (失败)回调
 */
- (void)insertTableInTransaction:(NSString *)tableName modelArr:(NSArray <id>*)modelArr excludeProperty:(NSArray <NSArray *>*)colArr callback:(void(^)(NSError *error ))block;

    //一组数据
    NSMutableArray *testModelArr = [NSMutableArray arrayWithCapacity:0];
//所有待插入模型对象中不需要插入到表的属性名集合
    NSMutableArray *exclude = [NSMutableArray arrayWithCapacity:0];
    for (int i = 0; i < 3; i  ) {
        Person *person = [[Person alloc] init];
        person.name = @"PersonName";
        person.phone = @(12345667890);
        person.userData = [@"testData" dataUsingEncoding:NSUTF8StringEncoding];
        person.identity = arc4random() % 1000;
        person.sex = 1;
        person.age = 23;
        person.height = 170.1;
        person.weight = 233.33333;
        person.testDic = [NSDictionary dictionary];

        [testModelArr addObject:person];

        [exclude addObject:@[@"height",@"weight"]];
    }
    [self.hxdb insertTableInTransaction:@"modelTable" modelArr:testModelArr excludeProperty:exclude callback:^(NSError *error) {
        NSLog(@"%@",error);;
    }];

关于excludeProperty:要求技师自行保管一一对应的涉及,倘使某模型对象没有要删减的性情,则附和的excludeArr为空数组就可以,举个例子[exclude addObject:@[]];;要是全数模型对象都不须要剔除有些品质,则excludeProperty传入nil就可以。

3.插入单条记录

/**
 插入单条记录

 @param tableName 表名
 @param paraDict 待插入数据。字典key:字段名,value:字段值
 @param block 回调
 */
- (void)insertTable:(NSString *)tableName param:(NSDictionary *)paraDict callback:(void(^)(NSError *error ))block;

NSDictionary *paraDict = @{@"name":@"commet",@"phone":@"13535230987",@"identity":@"999"};

    [self.hxdb insertTable:@"modelTable" param:paraDict callback:^(NSError *error) {
        if(error) NSLog(@"插入表失败:%@",error);
    }];

4.批量插入记录

/**
 批量插入记录

 @param tableName 表名
 @param paraArr 待插入数据数组。数组每个元素是字典,字典构成同上。
 @param block 回调
 */
- (void)insertTableInTransaction:(NSString *)tableName paramArr:(NSArray <NSDictionary *>*)paraArr callback:(void(^)(NSError *error))block;

LKDBSQLState

/**
 *  查询方法
 *
 *  @param obj   model类
 *  @param type  查询类型
 *  @param key   key
 *  @param opt   条件
 *  @param value 值
 */
- (LKDBSQLState *)object:(Class)obj
                       type:(QueryType)type
                        key:(id)key
                        opt:(NSString *)opt
                      value:(id)value;
/**
 *  生成查询语句
 */
-(NSString *)sqlOptionStr;

于是将闭馆数据库操作封装在框架中,这时候调用没有要求关切数据库的关门

5.2立异数据

1.翻新内定模型数据

/**
 更新单个模型

 @param tableName 表名
 @param model 模型对象
 @param colArr 模型中不需要更新的属性名集合
 @param where where子句字典。key:where子句遵循绑定语法,value:绑定值数组。比如“where name = 'John' AND age = '17'” -> @{@"WHERE name = ? AND age = ?":@[@"John",@"17"]}。要保证where字典有且仅有一组key-value
 @param block 回调
 */
- (void)updateTable:(NSString *)tableName model:(id)model excludeProperty:(NSArray *)colArr whereDict:(NSDictionary *)where callback:(void(^)(NSError *error ))block;

凭借模型对象更新数据,此中name、userData、identity、age属性无需校正。假诺where传入nil,则对每条记下都进展翻新。

//根据模型对象更新数据,其中name、userData、identity、age属性不需要更新
[self.hxdb updateTable:@"modelTable" model:person excludeProperty:@[@"name",@"userData",@"identity",@"age"] whereDict:@{@"where identity = ?" : @[@60]} callback:^(NSError *error) {
        NSLog(@"%@",error);
    }];

2.批量更新模型数据

/**
 批量更新模型

 @param tableName 表名
 @param modelArr 模型对象集合
 @param colArr 一一对应模型对象数组中的每一元素,模型对象中不需要更新的属性名集合
 @param whereArr where子句字典的集合。where子句字典 -- key:where子句遵循绑定语法,value:绑定值数组。比如“where name = 'John' AND age = '17'” -> @{@"WHERE name = ? AND age = ?":@[@"John",@"17"]}。要保证where字典有且仅有一组key-value
 @param block 回调
 */
- (void)updateTableInTransaction:(NSString *)tableName modelArr:(NSArray <id>*)modelArr excludeProperty:(NSArray <NSArray *>*)colArr whereArrs:(NSArray<NSDictionary *> *)whereArr callback:(void (^)(NSError *))block;

要介怀此处where子句(字典)必得和模型一一对应且必需不能够为空。由于这么些主意是对同三个表张开批量翻新,即便有中间三个未曾where子句(就能够更新整表),那么批量创新就没意义了

    NSMutableArray *testModelArr = [NSMutableArray arrayWithCapacity:0];
    NSMutableArray *exclude = [NSMutableArray arrayWithCapacity:0];
    NSMutableArray *whereArr = [NSMutableArray arrayWithCapacity:0];
    for (int i = 0; i < 3; i  ) {
        Person *person = [[Person alloc] init];
        person.name = @"PersonName";
        person.phone = @(11111111);
        person.userData = [@"testData" dataUsingEncoding:NSUTF8StringEncoding];
        person.identity = i 1;
        person.sex = 0;
        person.age = 24;
        person.height = 170.1;
        person.weight = 233.33333;
        person.testDic = [NSDictionary dictionary];

        [testModelArr addObject:person];

        [exclude addObject:@[@"height",@"weight"]];
        [whereArr addObject:@{@"where identity = ?" : @[[NSNumber numberWithInteger:person.identity]]}];
    }

    //批量更新模型
    [self.hxdb updateTableInTransaction:@"modelTable" modelArr:testModelArr excludeProperty:exclude whereArrs:whereArr callback:^(NSError *error) {
        NSLog(@"%@",error);
    }];

3.更新单个记录

/**
 更新单个记录

 @param tableName 表名
 @param paraDict 待更新数据。字典key:字段名,value:字段值
 @param where where子句字典。key:where子句遵循绑定语法,value:绑定值数组。比如“where name = 'John' AND age = '17'” -> @{@"WHERE name = ? AND age = ?":@[@"John",@"17"]}。要保证where字典有且仅有一组key-value
 @param block 回调
 */
- (void)updateTable:(NSString *)tableName param:(NSDictionary *)paraDict whereDict:(NSDictionary *)where callback:(void(^)(NSError *error ))block;

//更新单个记录
    NSDictionary *paraDict = @{@"name":@"commet",@"phone":@"13535230987"};

    [self.hxdb updateTable:@"modelTable" param:paraDict whereDict:@{@"where identity = ?" : @[@1]} callback:^(NSError *error) {
        if(error) NSLog(@"%@",error);
    }];

4.批量立异记录

/**
 批量更新记录

 @param tableName 表名
 @param paraArr 待更新数据集合。数组每个元素是字典,字典构成同上
 @param whereArr where子句字典的集合。where子句字典 -- key:where子句遵循绑定语法,value:绑定值数组。比如“where name = 'John' AND age = '17'” -> @{@"WHERE name = ? AND age = ?":@[@"John",@"17"]}。要保证where字典有且仅有一组key-value
 @param block 回调
 */
- (void)updateTableInTransaction:(NSString *)tableName paramArr:(NSArray <NSDictionary *>*)paraArr whereArrs:(NSArray <NSDictionary *>*)whereArr callback:(void(^)(NSError *error))block;

基本代码

通过runtime得到三个类的性质名称和种类,依照名称和类型更改建表语句。

// 获得一个类的属性名称操作
  objc_property_t * properties = class_copyPropertyList([self class], &outCount);
  for (int i = 0; i < outCount; i  ) {
      objc_property_t property = properties[i];
      //获得属性名称
       NSString *propertyName = [NSString stringWithCString:property_getName(property) encoding:NSUTF8StringEncoding];
      //获得属性类型
       NSString *propertyType = [NSString stringWithCString: property_getAttributes(property) encoding:NSUTF8StringEncoding];
  }

德姆o下载地址 gitHub

  • 5、面向模型开采,操作模型,特别面向对象,以前日常用数据库的时候平日都以直接保存后台重回的数额,那个时候历次抽出来都要转二次模型,麻烦

5.3去除数据

1.删减钦定数量

/**
 删除单条件记录

 @param tableName 表名
 @param where where子句字典。key:where子句遵循绑定语法,value:绑定值数组。比如“where name = 'John' AND age = '17'” -> @{@"WHERE name = ? AND age = ?":@[@"John",@"17"]}。要保证where字典有且仅有一组key-value
 @param block 回调
 */
- (void)deleteTable:(NSString *)tableName whereDict:(NSDictionary *)where callback:(void(^)(NSError *error))block;

假设where为空就删除整表数据

[self.hxdb deleteTable:@"modelTable" whereDict:@{@"where age = ?" : @[@24]} callback:^(NSError *error) {
        if(error) NSLog(@"%@",error);
    }];

2.批量删减数据

/**
 批量删除不同条件的记录

 @param tableName 表名
 @param whereArrs where子句字典的集合。where子句字典 -- key:where子句遵循绑定语法,value:绑定值数组。比如“where name = 'John' AND age = '17'” -> @{@"WHERE name = ? AND age = ?":@[@"John",@"17"]}。要保证where字典有且仅有一组key-value
 @param block 回调
 */
- (void)deleteTableInTransaction:(NSString *)tableName whereArrs:(NSArray <NSDictionary *>*)whereArrs callback:(void(^)(NSError *error))block;

    //批量删除
    NSMutableArray *deleteWhere = [NSMutableArray array];
    [deleteWhere addObject:@{@"where sex = ?" : @[@0]}];
    [deleteWhere addObject:@{@"where sex = ? and name = ?":@[@1,@"commet"]}];
    [deleteWhere addObject:@{@"where phone = ?" : @[@"305757732"]}];
    [self.hxdb deleteTableInTransaction:@"modelTable" whereArrs:deleteWhere callback:^(NSError *error) {

    }];

单例格局,项目中独此一家独此一家,方便管理,传入数据库名称,后续操作不相同的数据库

6.查询

1.基于准绳查询有微微条记下

/**
 根据条件查询有多少条记录

 @param tableName 表名
 @param where where子句字典。key:where子句遵循绑定语法,value:绑定值数组。比如“where name = 'John' AND age = '17'” -> @{@"WHERE name = ? AND age = ?":@[@"John",@"17"]}。要保证where字典有且仅有一组key-value
 @return 记录数目
 */
- (int)itemCountForTable:(NSString *)tableName whereDict:(NSDictionary *)where;

    int count = [self.hxdb itemCountForTable:@"modelTable" whereDict:@{@"where sex = ?" : @[@1]}];
    NSLog(@"count = %d",count);

2.基于模型类查询

/**
 根据条件查询模型

 @param tableName 表名
 @param cls 模型类
 @param colArr 模型中不需要被查询的属性名集合
 @param where where子句字典。key:where子句遵循绑定语法,value:绑定值数组。比如“where name = 'John' AND age = '17'” -> @{@"WHERE name = ? AND age = ?":@[@"John",@"17"]}。要保证where字典有且仅有一组key-value
 @param block 回调
 @return 查询结果
 */
- (NSMutableArray *)queryTable:(NSString *)tableName modelClass:(Class)cls excludeProperty:(NSArray *)colArr whereDict:(NSDictionary *)where callback:(void(^)(NSError *error))block;

    NSMutableArray *rsArr = [self.hxdb queryTable:@"modelTable" modelClass:NSClassFromString(@"Person") excludeProperty:nil whereDict:nil callback:^(NSError *error) {

    }];
    NSLog(@"rs:%@",rsArr);

3.基于标准查询

/**
 根据条件查询

 @param tableName 表名
 @param columnDict 查询字段。字典:key 字段名,value 字段对应的sql数据类型
 @param where where子句字典。key:where子句遵循绑定语法,value:绑定值数组。比如“where name = 'John' AND age = '17'” -> @{@"WHERE name = ? AND age = ?":@[@"John",@"17"]}。要保证where字典有且仅有一组key-value
 @param block 回调
 @return 查询结果
 */
- (NSMutableArray *)queryTable:(NSString *)tableName columns:(NSDictionary *)columnDict whereDict:(NSDictionary *)where callback:(void(^)(NSError *error))block;
  1. 询问整表
/**
 查询整表

 @param tableName 表名
 @param block 回调
 @return 查询结果
 */
- (NSMutableArray *)queryAll:(NSString *)tableName callback:(void(^)(NSError *error))block;

本文由bwin必赢发布,转载请注明来源

关键词: iOS i 模型 FMDB iOS数据存储