一行代码实现FMDB的CURD操作

2024-06-13 06:32

本文主要是介绍一行代码实现FMDB的CURD操作,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

上次实现FMDB的CURD基本操作后,用在项目里,每个实体类都要写SQL语句来实现创建表和CURD操作,总觉得太麻烦,然后就想着利用反射和kvc来实现一个数据库操作的基类继承一下,子类只需要继承,然后添加自己的属性就好,这里做一个总结。

第一个难点:获取子类的所有属性以及类型

OC中有提供获取所有property的方法,需要用到objc_property_t和class_copyPropertyList。

objc_property_t *properties =class_copyPropertyList([selfclass], &outCount); 数组properties有所有的属性以及其相应的属性类型。具体的代码如下:

/***  获取该类的所有属性*/
+ (NSDictionary *)getPropertys
{NSMutableArray *proNames = [NSMutableArray array];NSMutableArray *proTypes = [NSMutableArray array];NSArray *theTransients = [[self class] transients];unsigned int outCount, i;objc_property_t *properties = class_copyPropertyList([self class], &outCount);for (i = 0; i < outCount; i++) {objc_property_t property = properties[i];//获取属性名NSString *propertyName = [NSString stringWithCString:property_getName(property) encoding:NSUTF8StringEncoding];if ([theTransients containsObject:propertyName]) {continue;}[proNames addObject:propertyName];//获取属性类型等参数NSString *propertyType = [NSString stringWithCString: property_getAttributes(property) encoding:NSUTF8StringEncoding];/*c char         C unsigned chari int          I unsigned intl long         L unsigned longs short        S unsigned shortd double       D unsigned doublef float        F unsigned floatq long long    Q unsigned long longB BOOL@ 对象类型 //指针 对象类型 如NSString 是@“NSString”64位下long 和long long 都是TqSQLite 默认支持五种数据类型TEXT、INTEGER、REAL、BLOB、NULL*/if ([propertyType hasPrefix:@"T@"]) {[proTypes addObject:SQLTEXT];} else if ([propertyType hasPrefix:@"Ti"]||[propertyType hasPrefix:@"TI"]||[propertyType hasPrefix:@"Ts"]||[propertyType hasPrefix:@"TS"]||[propertyType hasPrefix:@"TB"]) {[proTypes addObject:SQLINTEGER];} else {[proTypes addObject:SQLREAL];}}free(properties);return [NSDictionary dictionaryWithObjectsAndKeys:proNames,@"name",proTypes,@"type",nil];
}
propertyTpe 在Xcode document 中,截图


类型主要是在创建表的时候需要用到,SQLite只支持五种数据类型TEXTINTEGERREALBLOBNULL,这里就需要将获取到得属性的类型转换一下,我主要用了TEXT/INTEGER/REAL三种。

然后就是拼接SQL语句了,这个也比较简单,创建表的SQL语句拼接在这里:

+ (NSString *)getColumeAndTypeString
{NSMutableString* pars = [NSMutableString string];NSDictionary *dict = [self.class getAllProperties];NSMutableArray *proNames = [dict objectForKey:@"name"];NSMutableArray *proTypes = [dict objectForKey:@"type"];for (int i=0; i< proNames.count; i++) {[pars appendFormat:@"%@ %@",[proNames objectAtIndex:i],[proTypes objectAtIndex:i]];if(i+1 != proNames.count){[pars appendString:@","];}}return pars;
}
第二个难点:查询出来的数据赋值给对象的对应属性

这里用到了KVC来赋值,主要方法就是setValue:forKey:

依然是先判断属性的类型,然后转换相应的数据类型,我这里主要是NSString和NSNumber。

if ([columeType isEqualToString:SQLTEXT]) {[model setValue:[resultSet stringForColumn:columeName] forKey:columeName];} else {[model setValue:[NSNumber numberWithLongLong:[resultSet longLongIntForColumn:columeName]] forKey:columeName];}

第三个难点:子类在实例化时,直接创建对应的数据库表,这里用dispatch_once实现,只需要创建一次。子类中覆写createTable方法。

+ (BOOL)createTable
{__block BOOL result = YES;static dispatch_once_t onceToken;dispatch_once(&onceToken, ^{result = [super createTable];});return result;
}
因为会有多线程操作,所以用单例和FMDatabaseQueue来执行,要避免queue里调用queue执行操作。

有一些属性不需要与数据库表字段映射,覆写方法+ (NSArray *)transients;在改方法中返回不需要映射的字段数组。

基类中的方法如下:

/** *  获取该类的所有属性*/
+ (NSDictionary *)getPropertys;/** 获取所有属性,包括主键 */
+ (NSDictionary *)getAllProperties;/** 数据库中是否存在表 */
+ (BOOL)isExistInTable;/** 保存或更新* 如果不存在主键,保存,* 有主键,则更新*/
- (BOOL)saveOrUpdate;
/** 保存单个数据 */
- (BOOL)save;
/** 批量保存数据 */
+ (BOOL)saveObjects:(NSArray *)array;
/** 更新单个数据 */
- (BOOL)update;
/** 批量更新数据*/
+ (BOOL)updateObjects:(NSArray *)array;
/** 删除单个数据 */
- (BOOL)deleteObject;
/** 批量删除数据 */
+ (BOOL)deleteObjects:(NSArray *)array;
/** 通过条件删除数据 */
+ (BOOL)deleteObjectsByCriteria:(NSString *)criteria;/** 查询全部数据 */
+ (NSArray *)findAll;/** 通过主键查询 */
+ (instancetype)findByPK:(int)inPk;/** 查找某条数据 */
+ (instancetype)findFirstByCriteria:(NSString *)criteria;/** 通过条件查找数据 * 这样可以进行分页查询 @" WHERE pk > 5 limit 10"*/
+ (NSArray *)findByCriteria:(NSString *)criteria;#pragma mark - must be override method
/*** 创建表* 如果已经创建,返回YES*/
+ (BOOL)createTable;
/** 如果子类中有一些property不需要创建数据库字段,那么这个方法必须在子类中重写 */
+ (NSArray *)transients;

JKDBModel添加了自动更新的检测和添加实体类字段的功能。最新代码在Github。

具体用法请转到github下载源码:https://github.com/Joker-King/JKDBModel


这篇关于一行代码实现FMDB的CURD操作的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/1056535

相关文章

SpringBoot使用ffmpeg实现视频压缩

《SpringBoot使用ffmpeg实现视频压缩》FFmpeg是一个开源的跨平台多媒体处理工具集,用于录制,转换,编辑和流式传输音频和视频,本文将使用ffmpeg实现视频压缩功能,有需要的可以参考... 目录核心功能1.格式转换2.编解码3.音视频处理4.流媒体支持5.滤镜(Filter)安装配置linu

在Spring Boot中实现HTTPS加密通信及常见问题排查

《在SpringBoot中实现HTTPS加密通信及常见问题排查》HTTPS是HTTP的安全版本,通过SSL/TLS协议为通讯提供加密、身份验证和数据完整性保护,下面通过本文给大家介绍在SpringB... 目录一、HTTPS核心原理1.加密流程概述2.加密技术组合二、证书体系详解1、证书类型对比2. 证书获

Druid连接池实现自定义数据库密码加解密功能

《Druid连接池实现自定义数据库密码加解密功能》在现代应用开发中,数据安全是至关重要的,本文将介绍如何在​​Druid​​连接池中实现自定义的数据库密码加解密功能,有需要的小伙伴可以参考一下... 目录1. 环境准备2. 密码加密算法的选择3. 自定义 ​​DruidDataSource​​ 的密码解密3

使用Python实现Windows系统垃圾清理

《使用Python实现Windows系统垃圾清理》Windows自带的磁盘清理工具功能有限,无法深度清理各类垃圾文件,所以本文为大家介绍了如何使用Python+PyQt5开发一个Windows系统垃圾... 目录一、开发背景与工具概述1.1 为什么需要专业清理工具1.2 工具设计理念二、工具核心功能解析2.

MySQL 添加索引5种方式示例详解(实用sql代码)

《MySQL添加索引5种方式示例详解(实用sql代码)》在MySQL数据库中添加索引可以帮助提高查询性能,尤其是在数据量大的表中,下面给大家分享MySQL添加索引5种方式示例详解(实用sql代码),... 在mysql数据库中添加索引可以帮助提高查询性能,尤其是在数据量大的表中。索引可以在创建表时定义,也可

使用C#删除Excel表格中的重复行数据的代码详解

《使用C#删除Excel表格中的重复行数据的代码详解》重复行是指在Excel表格中完全相同的多行数据,删除这些重复行至关重要,因为它们不仅会干扰数据分析,还可能导致错误的决策和结论,所以本文给大家介绍... 目录简介使用工具C# 删除Excel工作表中的重复行语法工作原理实现代码C# 删除指定Excel单元

Java实现本地缓存的常用方案介绍

《Java实现本地缓存的常用方案介绍》本地缓存的代表技术主要有HashMap,GuavaCache,Caffeine和Encahche,这篇文章主要来和大家聊聊java利用这些技术分别实现本地缓存的方... 目录本地缓存实现方式HashMapConcurrentHashMapGuava CacheCaffe

SpringBoot整合Sa-Token实现RBAC权限模型的过程解析

《SpringBoot整合Sa-Token实现RBAC权限模型的过程解析》:本文主要介绍SpringBoot整合Sa-Token实现RBAC权限模型的过程解析,本文给大家介绍的非常详细,对大家的学... 目录前言一、基础概念1.1 RBAC模型核心概念1.2 Sa-Token核心功能1.3 环境准备二、表结

Python实现一键PDF转Word(附完整代码及详细步骤)

《Python实现一键PDF转Word(附完整代码及详细步骤)》pdf2docx是一个基于Python的第三方库,专门用于将PDF文件转换为可编辑的Word文档,下面我们就来看看如何通过pdf2doc... 目录引言:为什么需要PDF转Word一、pdf2docx介绍1. pdf2docx 是什么2. by

使用Python实现网页表格转换为markdown

《使用Python实现网页表格转换为markdown》在日常工作中,我们经常需要从网页上复制表格数据,并将其转换成Markdown格式,本文将使用Python编写一个网页表格转Markdown工具,需... 在日常工作中,我们经常需要从网页上复制表格数据,并将其转换成Markdown格式,以便在文档、邮件或