{"id":15034424,"url":"https://github.com/huangzhibiao/bgfmdb","last_synced_at":"2025-05-15T15:05:53.039Z","repository":{"id":46601332,"uuid":"69442808","full_name":"huangzhibiao/BGFMDB","owner":"huangzhibiao","description":"BGFMDB让数据的增删改查分别只需要一行代码即可,就是这么简单任性，本库几乎支持存储ios所有基本的自带数据类型.","archived":false,"fork":false,"pushed_at":"2023-07-21T08:14:17.000Z","size":9537,"stargazers_count":1448,"open_issues_count":82,"forks_count":326,"subscribers_count":37,"default_branch":"master","last_synced_at":"2025-05-07T12:43:55.835Z","etag":null,"topics":["coredata","fmdb","ios","jrdb","lkdbhelper","realm","sqlite"],"latest_commit_sha":null,"homepage":"","language":"Objective-C","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/huangzhibiao.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2016-09-28T08:32:15.000Z","updated_at":"2025-04-24T17:15:28.000Z","dependencies_parsed_at":"2024-06-18T12:29:20.929Z","dependency_job_id":"b51887b5-9666-4f91-994c-8e86841b645f","html_url":"https://github.com/huangzhibiao/BGFMDB","commit_stats":{"total_commits":229,"total_committers":2,"mean_commits":114.5,"dds":0.004366812227074246,"last_synced_commit":"7a9392636fea94bc3e4de5f5468b218c663f12a6"},"previous_names":[],"tags_count":66,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/huangzhibiao%2FBGFMDB","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/huangzhibiao%2FBGFMDB/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/huangzhibiao%2FBGFMDB/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/huangzhibiao%2FBGFMDB/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/huangzhibiao","download_url":"https://codeload.github.com/huangzhibiao/BGFMDB/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":254364270,"owners_count":22058878,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["coredata","fmdb","ios","jrdb","lkdbhelper","realm","sqlite"],"created_at":"2024-09-24T20:25:00.242Z","updated_at":"2025-05-15T15:05:52.985Z","avatar_url":"https://github.com/huangzhibiao.png","language":"Objective-C","funding_links":[],"categories":[],"sub_categories":[],"readme":"# BGFMDB让数据的增删改查分别只需要一行代码即可,就是这么简单任性.\n## 最新重大更新:   \n1.增加了自定义“联合主键”的功能.       \n2.进行了大重构，优化缩减API，支持多个'唯一约束'，ignoredKeys放到模型类.m文件实现bg_ignoreKeys类函数即可，增加自定义表名功能.       \n## Swift工程中使用方式    \n目前可以存储Swift工程中的OC类model,在桥接文件导入OC类model的头文件即可, 但是不能解析存储Swift类model,后面会补上Swift类model解析部分😊.    \n## 小伙伴们的使用反馈   \n![BGFMDB](http://o7pq80nc2.bkt.clouddn.com/showUse_meitu.jpg \"小伙伴们的使用反馈\")\n## 交流QQ群:         \n使用交流QQ群: 572359447    \n如果在使用过程中发现什么问题或有什么疑问,请加群反馈.    \n## 完美支持:    \nint,long,signed,float,double,NSInteger,CGFloat,BOOL,NSString,NSMutableString,NSMutableAttributedString,NSAttributedString,NSNumber,NSArray,NSMutableArray,NSDictionary,NSMutableDictionary,NSMapTable,NSHashTable,NSData,NSMutableData,UIImage,NSDate,NSURL,NSRange,CGRect,CGSize,CGPoint,自定义对象 等的存储.   \n## 写本库的动机: 在对coredata和realm做了探究总结后,发现了很多有缺陷的地方,最明显的就是下面的原因:   \n### realm缺陷: \nRealm不支持集合类型,这一点也是比较蛋疼。   \nRealm支持以下的属性类型：BOOL、bool、int、NSInteger、long、long long、float、double、NSString、NSDate、NSData以及 被特殊类型标记的NSNumber。CGFloat属性的支持被取消了，因为它不具备平台独立性。    \n这里就是不支持集合，比如说NSArray，NSMutableArray，NSDictionary，NSMutableDictionary，NSSet，NSMutableSet。如果服务器传来的一个字典，key是一个字符串，对应的value就是一个数组，这时候就想存储这个数组就比较困难了。   \n### coredata缺陷:   \ncoredata虽然通过Transformable可以存取集合类型,但需要开发者去进行转换处理,使用起来不方便直观,虽然coredata有很多好用的封装库,像ResKit,MMRecord等,但这些库比较庞大,而且都是英文介绍,不利于国内初中级开发的快速开发使用.    \n## 虽然国内也已经有了对FMDB面相对象层的封装,比如像JRDB,LKDBHelper等,但是在使用总结后还是发现不少的问题,问题如下:    \nJRDB存储数组需要传入对象的泛型,同时还要复写一些函数和映射，这对于初中级开发者是很不利的,看的很萌逼.    \nLKDBHelper好一点,但也要复写不少的函数,而且LKDBHelper的使用demo有点乱,还有就是不支持NSMaptable,NSHashTable的存储,LKDBHelper还有一个致命的弱点就是当类变量名称跟sqlite的关键字一样时,会发生冲突错误！  \n### 而最重要的是: JRDB,LKDBHelper都不支持同一数组中存储不同类型的自定义类型数据,BGFMDB则完美支持,JRDB,LKDBHelper已经成为过去,现在是BGFMDB的时代,作者的宣言是：“要把BGFMDB写成不会写代码的人都会用的库”，欢迎大家反馈和吐槽问题,骚年作者等着你们.\n## 综合上述原因后,我决定写一款适合国内初中级开发者使用的存储封装库(BGFMDB),不管是从使用步骤还是支持的存储类型上,都比JRDB,LKDB简单好用和全面.    \n## 本库几乎支持存储ios所有基本的自带数据类型.    \n## 使用介绍(喜欢的话别忘了给本库一个Star😊).   \n## 想加密数据库的,请借鉴此demo:![SQLCipherDemo](https://github.com/huangzhibiao/SQLCipherDemo)     \n## CocoaPods的方式.\n### Podfile\n```Podfile\nplatform :ios, '8.0'\n\ntarget '工程名称' do\npod 'BGFMDB', '~\u003e 2.0.9'\nend\n```\n## 直接下载库代码使用方式.\n### 添加所需依赖库   \nlibsqlite3   \n### 导入头文件   \n```Objective-C\n/**\n只要在自己的类中导入了BGFMDB.h这个头文件,本类就具有了存储功能.\n*/\n#import \u003cFoundation/Foundation.h\u003e\n#import \"BGFMDB.h\"\n@interface stockModel : NSObject\n@property(nonatomic,copy)NSString* name;\n@property(nonatomic,strong)NSNumber* stockData;\n+(instancetype)stockWithName:(NSString*)name stockData:(NSNumber*)stockData;\n@end\n```\n### 主键\n```Objective-C\n/**\n本库自带的自动增长主键.\n*/\n@property(nonatomic,strong)NSNumber*_Nullable bg_id;\n\n/**\n 为了方便开发者，特此加入以下两个字段属性供开发者做参考.(自动记录数据的存入时间和更新时间)\n */\n@property(nonatomic,copy)NSString* _Nonnull bg_createTime;//数据创建时间(即存入数据库的时间)\n@property(nonatomic,copy)NSString* _Nonnull bg_updateTime;//数据最后那次更新的时间.\n\n/**\n 自定义表名\n */\n@property(nonatomic,copy)NSString* _Nonnull bg_tableName;\n```\n### 联合主键\n```Objective-C\n/**\n 自定义“联合主键” ,这里指定 name和age 为“联合主键”.\n */\n+(NSArray *)bg_unionPrimaryKeys{\n    return @[@\"name\",@\"age\"];\n}\n```\n### 唯一约束\n```Objective-C\n/**\n 如果需要指定“唯一约束”字段, 在模型.m文件中实现该函数,这里指定 name和age 为“唯一约束”.\n */\n+(NSArray *)bg_uniqueKeys{\n    return @[@\"name\",@\"age\"];\n}\n```\n### 设置不需要存储的属性\n```Objective-C\n/**\n 设置不需要存储的属性, 在模型.m文件中实现该函数.\n */\n+(NSArray *)bg_ignoreKeys{\n   return @[@\"eye\",@\"sex\",@\"num\"];\n}\n```\n### 初始化对象\n```Objective-C\nPeople* p = [self people];\n```\n### 存储\n```Objective-C\n/**\n同步存储.\n*/\n[p bg_save];\n\n/**\n异步存储.\n*/\n[p bg_saveAsync:^(BOOL isSuccess) {\n       //you code\n   }];\n   \n/**\n覆盖掉原来People类的所有数据,只存储当前对象的数据.\n*/\n[p bg_cover];\n\n/**\n 同步存储或更新.\n 当\"唯一约束\"或\"主键\"存在时，此接口会更新旧数据,没有则存储新数据.\n 提示：“唯一约束”优先级高于\"主键\".\n */\n [p bg_saveOrUpdate];\n \n/**\n同步 存储或更新 数组元素.\n当\"唯一约束\"或\"主键\"存在时，此接口会更新旧数据,没有则存储新数据.\n提示：“唯一约束”优先级高于\"主键\".\n*/\n[People bg_saveOrUpdateArray:@[p,p1,p2]];\n```\n### 查询\n```Objective-C\n/**\n同步查询所有数据.\n*/\nNSArray* finfAlls = [People bg_findAll:bg_tablename];\n\n/**\n按条件查询.\n*/\nNSString* where = [NSString stringWithFormat:@\"where %@=%@\",bg_sqlKey(@\"name\"),bg_sqlValue(@\"斯巴达\")];\nNSArray* arr = [People bg_find:bg_tablename where:where];\n\n/**\n 直接写SQL语句操作.\n */\nNSArray* arr = bg_executeSql(@\"select * from yy\", bg_tablename, [People class]);//查询时,后面两个参数必须要传入.\n\n/**\n 根据范围查询.\n*/\nNSArray* arr = [People bg_find:bg_tablename range:NSMakeRange(i,50) orderBy:nil desc:NO];\n```\n### 更新\n```Objective-C\n/**\n 单个对象更新.\n 支持keyPath.\n */\n NSString* where = [NSString stringWithFormat:@\"where %@ or %@=%@\",bg_keyPathValues(@[@\"user.student.human.body\",bg_equal,@\"小芳\"]),bg_sqlKey(@\"age\"),bg_sqlValue(@(31))];\n  [p bg_updateWhere:where];\n  \n/**\n sql语句批量更新.\n */\n  NSString* where = [NSString stringWithFormat:@\"set %@=%@ where %@=%@\",bg_sqlKey(@\"name\"),bg_sqlValue(@\"马化腾\"),bg_sqlKey(@\"name\"),bg_sqlValue(@\"天朝\")];\n  [People bg_update:bg_tablename where:where];  \n  \n/**\n 直接写SQL语句操作\n */\nbg_executeSql(@\"update yy set BG_name='标哥'\", nil, nil);//更新或删除等操作时,后两个参数不必传入.\n```\n### 删除\n```Objective-C\n/**\n 按条件删除.\n */\nNSString* where = [NSString stringWithFormat:@\"where %@=%@\",bg_sqlKey(@\"name\"),bg_sqlValue(@\"斯巴达\")];\n[People bg_delete:bg_tablename where:where];\n\n/**\n清除表的所有数据.\n*/\n[People bg_clear:bg_tablename];\n\n/**\n删除数据库表.\n*/\n[People bg_drop:bg_tablename];\n\n```\n### 获取类数据库版本\n```Objective-C\n/**\n 获取该类的数据库版本号;\n*/\nNSInteger version = [People bg_version:bg_tablename];\n```\n### 类数据库版本手动升级(当'唯一约束','联合主键','属性类型改变',发生改变时需要手动调用升级,其他情况库自动检测升级)\n```Objective-C\n//注: 版本号从1开始,依次往后递增,本次更新版本号不得 低于或等于 上次的版本号,否则不会更新.\n/**\n 如果类'唯一约束','联合主键','属性类型'发生改变.\n 则调用此API刷新该类数据库,不需要新旧映射的情况下使用此API.\n*/\n[People bg_update:bg_tablename version:version];\n\n/**\n如果类'唯一约束','联合主键','属性类型'发生改变.\n则调用此API刷新该类数据库.data2是新变量名,data是旧变量名,即将旧的值映射到新的变量名,其他不变的变量名会自动复制,只管写出变化的对应映射即可.\n*/\n[People bg_update:bg_tablename version:version keyDict:@{@\"data2\":@\"data\"}];\n```\n### 事务操作\n```Objective-C\n/**\n事务操作,返回YES提交事务,返回NO则回滚事务.\n*/\nbg_inTransaction(^BOOL{\n        [p bg_save];//存储\n        return NO;\n    });\n```\n### 快速查询数据条数\n```Objective-C\n/**\n按条件查询表中所有数据的条数.\n*/\nNSInteger count = [People bg_count:bg_tablename where:nil];\n```\n### 类数据之间的拷贝\n```Objective-C\n/**\n 将People表的数据拷贝给bg_tablename表, name拷贝给Man的Man_name，其他同理.\n */\n [People bg_copy:nil toTable:bg_tablename keyDict:@{@\"name\":@\"Man_name\",\n                                                       @\"num\":@\"Man_num\",\n                                                       @\"age\":@\"Man_age\",\n                                                       @\"image\":@\"image\"} append:NO];\n```\n### 直接存取数组\n```Objective-C\nNSMutableArray* testA = [NSMutableArray array];\n    [testA addObject:@\"我是\"];\n    [testA addObject:@(10)];\n    [testA addObject:@(9.999)];\n    [testA addObject:@{@\"key\":@\"value\"}];\n    /**\n     存储标识名为testA的数组.\n     */\n    [testA bg_saveArrayWithName:@\"testA\"];\n    \n    /**\n     往标识名为@\"testA\"的数组中添加元素.\n     */\n    [NSArray bg_addObjectWithName:@\"testA\" object:@[@(1),@\"哈哈\"]];\n    \n    /**\n     删除标识名为testA的数组某个位置上的元素.\n     */\n    [NSArray bg_deleteObjectWithName:@\"testA\" Index:3];\n    \n    /**\n     查询标识名为testA的数组全部元素.\n     */\n    NSArray* testResult = [NSArray bg_arrayWithName:@\"testA\"];\n    \n    /**\n     获取标识名为testA的数组某个位置上的元素.\n     */\n    id arrObject = [NSArray bg_objectWithName:@\"testA\" Index:3];\n    \n    /**\n     清除标识名为testA的数组所有元素.\n     */\n    [NSArray bg_clearArrayWithName:@\"testA\"];\n```\n### 直接存取字典\n```Objective-C\nNSDictionary* dict = @{@\"one\":@(1),@\"key\":@\"value\",@\"array\":@[@(1.2),@\"哈哈\"]};\n    /**\n     存储字典.\n     */\n    [dict bg_saveDictionary];\n    \n    /**\n     添加字典元素.\n     */\n    [NSDictionary bg_setValue:@\"标哥\" forKey:@\"name\"];\n    \n    /**\n     获取某个字典元素.\n     */\n    id num = [NSDictionary bg_valueForKey:@\"one\"];\n    \n    /**\n     移除字典某个元素.\n     */\n    [NSDictionary bg_removeValueForKey:@\"key\"];\n    \n    /**\n     遍历字典元素.\n     */\n    [NSDictionary bg_enumerateKeysAndObjectsUsingBlock:^(NSString * _Nonnull key, id  _Nonnull value, BOOL *stop) {\n        NSLog(@\"key = %@ , value = %@\",key,value);\n    }];\n    \n    /**\n     清空字典.\n     */\n    [NSDictionary bg_clearDictionary];\n```\n### 注册数据变化监听\n```Objective-C\n/**\n注册监听bg_tablename表的数据变化，唯一识别标识是@\"change\".  \n*/\n[People bg_registerChangeForTableName:bg_tablename identify:@\"change\" block:^(bg_changeState result) {\n        switch (result) {\n            case bg_insert:\n                NSLog(@\"有数据插入\");\n                break;\n            case bg_update:\n                NSLog(@\"有数据更新\");\n                break;\n            case bg_delete:\n                NSLog(@\"有数据删删除\");\n                break;\n            case bg_drop:\n                NSLog(@\"有表删除\");\n                break;\n            default:\n                break;\n        }\n    }];\n```\n### 移除数据监听\n```Objective-C\n/**\n移除bg_tablename表数据变化的监听，唯一识别标识是@\"change\".  \n*/\n [People bg_removeChangeForTableName:bg_tablename identify:@\"change\"];\n```\n### 字典转模型\n```Objective-C\nNSDictionary* dictAni = [self getDogDict];\n/**\n一代码搞定字典转模型.\n*/\nDog* dog = [Dog bg_objectWithKeyValues:dictAni];\n\nNSDictionary* dictMy = [self getMyDict];\n/**\n一代码搞定字典转模型.\n*/\nMy* my = [My bg_objectWithDictionary:dictMy];\n```\n### 模型转字典\n```Objective-C\n/**\n一句代码搞定模型转字典.\n*/\n NSDictionary* dictBodyAll = [body bg_keyValuesIgnoredKeys:nil];\n \n/**\n忽略掉hand这个变量不转.\n*/\nNSDictionary* dictBody = [body bg_keyValuesIgnoredKeys:@[@\"hand\"]];\n```\n### 如果模型中的数组变量存储的是自定义类,则需要实现下面的这个函数:\n```Objective-C\n/**\n如果模型中有数组且存放的是自定义的类(NSString等系统自带的类型就不必要了),那就实现该函数,key是数组名称,value是自定的类Class,用法跟MJExtension一样.\n(‘字典转模型’ 或 ’模型转字典‘ 都需要实现该函数)\n*/\n+(NSDictionary *)bg_objectClassInArray{\n    return @{@\"dogs\":[Dog class],@\"bodys\":[Body class]};\n}\n\n/**\n 如果模型中有自定义类变量,则实现该函数对应进行集合到模型的转换.\n 将json数据中body这个key对应的值转化为Body类变量body对象.\n */\n+(NSDictionary *)bg_objectClassForCustom{\n    return @{@\"body\":[Body class]};\n}\n\n/**\n 替换变量的功能(及当字典的key和属性名不一样时，进行映射对应起来)\n 即将字典里key为descri的值 赋给 属性名为intro的变量,性别和sex同理.\n */\n+(NSDictionary *)bg_replacedKeyFromPropertyName{\n    return @{@\"descri\":@\"intro\",@\"性别\":@\"sex\"};\n}\n```\n### 更多功能请下载demo运行了解使用.   \n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhuangzhibiao%2Fbgfmdb","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fhuangzhibiao%2Fbgfmdb","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhuangzhibiao%2Fbgfmdb/lists"}