NSObject+BGModel.m 42 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111
  1. //
  2. // NSObject+BGModel.m
  3. // BGDB
  4. //
  5. // Created by huangzhibiao on 17/2/28.
  6. // Copyright © 2017年 Biao. All rights reserved.
  7. //
  8. #import "NSObject+BGModel.h"
  9. #import "BGDB.h"
  10. #import "BGTool.h"
  11. #import <objc/message.h>
  12. #import <UIKit/UIKit.h>
  13. #define bg_getIgnoreKeys [BGTool executeSelector:bg_ignoreKeysSelector forClass:[self class]]
  14. @implementation NSObject (BGModel)
  15. //分类中只生成属性get,set函数的声明,没有声称其实现,所以要自己实现get,set函数.
  16. -(NSNumber *)bg_id{
  17. return objc_getAssociatedObject(self, _cmd);
  18. }
  19. -(void)setBg_id:(NSNumber *)bg_id{
  20. objc_setAssociatedObject(self,@selector(bg_id),bg_id,OBJC_ASSOCIATION_RETAIN_NONATOMIC);
  21. }
  22. -(NSString *)bg_createTime{
  23. return objc_getAssociatedObject(self, _cmd);
  24. }
  25. -(void)setBg_createTime:(NSString *)bg_createTime{
  26. objc_setAssociatedObject(self,@selector(bg_createTime),bg_createTime,OBJC_ASSOCIATION_COPY_NONATOMIC);
  27. }
  28. -(NSString *)bg_updateTime{
  29. return objc_getAssociatedObject(self, _cmd);
  30. }
  31. -(void)setBg_updateTime:(NSString *)bg_updateTime{
  32. objc_setAssociatedObject(self,@selector(bg_updateTime),bg_updateTime,OBJC_ASSOCIATION_COPY_NONATOMIC);
  33. }
  34. -(NSString *)bg_tableName{
  35. return objc_getAssociatedObject(self, _cmd);
  36. }
  37. -(void)setBg_tableName:(NSString *)bg_tableName{
  38. objc_setAssociatedObject(self,@selector(bg_tableName),bg_tableName,OBJC_ASSOCIATION_COPY_NONATOMIC);
  39. }
  40. /**
  41. @tablename 此参数为nil时,判断以当前类名为表名的表是否存在; 此参数非nil时,判断以当前参数为表名的表是否存在.
  42. */
  43. +(BOOL)bg_isExistForTableName:(NSString *)tablename{
  44. if(tablename == nil){
  45. tablename = NSStringFromClass([self class]);
  46. }
  47. BOOL result = [[BGDB shareManager] bg_isExistWithTableName:tablename];
  48. //关闭数据库
  49. [[BGDB shareManager] closeDB];
  50. return result;
  51. }
  52. /**
  53. 同步存储.
  54. */
  55. -(BOOL)bg_save{
  56. __block BOOL result;
  57. [[BGDB shareManager] saveObject:self ignoredKeys:bg_getIgnoreKeys complete:^(BOOL isSuccess) {
  58. result = isSuccess;
  59. }];
  60. //关闭数据库
  61. [[BGDB shareManager] closeDB];
  62. return result;
  63. }
  64. /**
  65. 异步存储.
  66. */
  67. -(void)bg_saveAsync:(bg_complete_B)complete{
  68. [[BGDB shareManager] addToThreadPool:^{
  69. BOOL result = [self bg_save];
  70. bg_completeBlock(result);
  71. }];
  72. }
  73. /**
  74. 同步存储或更新.
  75. 当"唯一约束"或"主键"存在时,此接口会更新旧数据,没有则存储新数据.
  76. 提示:“唯一约束”优先级高于"主键".
  77. */
  78. -(BOOL)bg_saveOrUpdate{
  79. return [[self class] bg_saveOrUpdateArray:@[self]];
  80. }
  81. /**
  82. 同上条件异步.
  83. */
  84. -(void)bg_saveOrUpdateAsync:(bg_complete_B)complete{
  85. [[BGDB shareManager] addToThreadPool:^{
  86. BOOL result = [self bg_saveOrUpdate];
  87. bg_completeBlock(result);
  88. }];
  89. }
  90. /**
  91. 同步 存储或更新 数组元素.
  92. @array 存放对象的数组.(数组中存放的是同一种类型的数据)
  93. 当"唯一约束"或"主键"存在时,此接口会更新旧数据,没有则存储新数据.
  94. 提示:“唯一约束”优先级高于"主键".
  95. */
  96. +(BOOL)bg_saveOrUpdateArray:(NSArray* _Nonnull)array{
  97. NSAssert(array && array.count,@"数组没有元素!");
  98. __block BOOL result;
  99. [[BGDB shareManager] bg_saveOrUpateArray:array ignoredKeys:bg_getIgnoreKeys complete:^(BOOL isSuccess) {
  100. result = isSuccess;
  101. }];
  102. //关闭数据库
  103. [[BGDB shareManager] closeDB];
  104. return result;
  105. }
  106. /**
  107. 同上条件异步.
  108. */
  109. +(void)bg_saveOrUpdateArrayAsync:(NSArray* _Nonnull)array complete:(bg_complete_B)complete{
  110. [[BGDB shareManager] addToThreadPool:^{
  111. BOOL result = [self bg_saveOrUpdateArray:array];
  112. bg_completeBlock(result);
  113. }];
  114. }
  115. /**
  116. 同步覆盖存储.
  117. 覆盖掉原来的数据,只存储当前的数据.
  118. */
  119. -(BOOL)bg_cover{
  120. __block BOOL result;
  121. [[BGDB shareManager] clearWithObject:self complete:nil];
  122. [[BGDB shareManager] saveObject:self ignoredKeys:bg_getIgnoreKeys complete:^(BOOL isSuccess) {
  123. result = isSuccess;
  124. }];
  125. //关闭数据库
  126. [[BGDB shareManager] closeDB];
  127. return result;
  128. }
  129. /**
  130. 同上条件异步.
  131. */
  132. -(void)bg_coverAsync:(bg_complete_B)complete{
  133. [[BGDB shareManager] addToThreadPool:^{
  134. BOOL result = [self bg_cover];
  135. bg_completeBlock(result);
  136. }];
  137. }
  138. /**
  139. 同步查询所有结果.
  140. @tablename 当此参数为nil时,查询以此类名为表名的数据,非nil时,查询以此参数为表名的数据.
  141. 温馨提示: 当数据量巨大时,请用范围接口进行分页查询,避免查询出来的数据量过大导致程序崩溃.
  142. */
  143. +(NSArray* _Nullable)bg_findAll:(NSString* _Nullable)tablename{
  144. if (tablename == nil) {
  145. tablename = NSStringFromClass([self class]);
  146. }
  147. __block NSArray* results;
  148. [[BGDB shareManager] queryObjectWithTableName:tablename class:[self class] where:nil complete:^(NSArray * _Nullable array) {
  149. results = array;
  150. }];
  151. //关闭数据库
  152. [[BGDB shareManager] closeDB];
  153. return results;
  154. }
  155. /**
  156. 同上条件异步.
  157. */
  158. +(void)bg_findAllAsync:(NSString* _Nullable)tablename complete:(bg_complete_A)complete{
  159. [[BGDB shareManager] addToThreadPool:^{
  160. NSArray* array = [self bg_findAll:tablename];
  161. bg_completeBlock(array);
  162. }];
  163. }
  164. /**
  165. 查找第一条数据
  166. @tablename 当此参数为nil时,查询以此类名为表名的数据,非nil时,查询以此参数为表名的数据.
  167. */
  168. +(id _Nullable)bg_firstObjet:(NSString* _Nullable)tablename{
  169. NSArray* array = [self bg_find:tablename limit:1 orderBy:nil desc:NO];
  170. return (array&&array.count)?array.firstObject:nil;
  171. }
  172. /**
  173. 查找最后一条数据
  174. @tablename 当此参数为nil时,查询以此类名为表名的数据,非nil时,查询以此参数为表名的数据.
  175. */
  176. +(id _Nullable)bg_lastObject:(NSString* _Nullable)tablename{
  177. NSArray* array = [self bg_find:tablename limit:1 orderBy:nil desc:YES];
  178. return (array&&array.count)?array.firstObject:nil;
  179. }
  180. /**
  181. 查询某一行数据
  182. @tablename 当此参数为nil时,查询以此类名为表名的数据,非nil时,查询以此参数为表名的数据.
  183. @row 从第1行开始算起.
  184. */
  185. +(id _Nullable)bg_object:(NSString* _Nullable)tablename row:(NSInteger)row{
  186. NSArray* array = [self bg_find:tablename range:NSMakeRange(row,1) orderBy:nil desc:NO];
  187. return (array&&array.count)?array.firstObject:nil;
  188. }
  189. /**
  190. 同步查询所有结果.
  191. @tablename 当此参数为nil时,查询以此类名为表名的数据,非nil时,查询以此参数为表名的数据.
  192. @orderBy 要排序的key.
  193. @limit 每次查询限制的条数,0则无限制.
  194. @desc YES:降序,NO:升序.
  195. */
  196. +(NSArray* _Nullable)bg_find:(NSString* _Nullable)tablename limit:(NSInteger)limit orderBy:(NSString* _Nullable)orderBy desc:(BOOL)desc{
  197. if(tablename == nil) {
  198. tablename = NSStringFromClass([self class]);
  199. }
  200. NSMutableString* where = [NSMutableString string];
  201. orderBy?[where appendFormat:@"order by %@%@ ",BG,orderBy]:[where appendFormat:@"order by %@ ",bg_rowid];
  202. desc?[where appendFormat:@"desc"]:[where appendFormat:@"asc"];
  203. !limit?:[where appendFormat:@" limit %@",@(limit)];
  204. __block NSArray* results;
  205. [[BGDB shareManager] queryObjectWithTableName:tablename class:[self class] where:where complete:^(NSArray * _Nullable array) {
  206. results = array;
  207. }];
  208. //关闭数据库
  209. [[BGDB shareManager] closeDB];
  210. return results;
  211. }
  212. /**
  213. 同上条件异步.
  214. */
  215. +(void)bg_findAsync:(NSString* _Nullable)tablename limit:(NSInteger)limit orderBy:(NSString* _Nullable)orderBy desc:(BOOL)desc complete:(bg_complete_A)complete{
  216. [[BGDB shareManager] addToThreadPool:^{
  217. NSArray* array = [self bg_find:tablename limit:limit orderBy:orderBy desc:desc];
  218. bg_completeBlock(array);
  219. }];
  220. }
  221. /**
  222. 同步查询所有结果.
  223. @tablename 当此参数为nil时,查询以此类名为表名的数据,非nil时,查询以此参数为表名的数据.
  224. @orderBy 要排序的key.
  225. @range 查询的范围(从location开始的后面length条,localtion要大于0).
  226. @desc YES:降序,NO:升序.
  227. */
  228. +(NSArray* _Nullable)bg_find:(NSString* _Nullable)tablename range:(NSRange)range orderBy:(NSString* _Nullable)orderBy desc:(BOOL)desc{
  229. if(tablename == nil) {
  230. tablename = NSStringFromClass([self class]);
  231. }
  232. NSMutableString* where = [NSMutableString string];
  233. orderBy?[where appendFormat:@"order by %@%@ ",BG,orderBy]:[where appendFormat:@"order by %@ ",bg_rowid];
  234. desc?[where appendFormat:@"desc"]:[where appendFormat:@"asc"];
  235. NSAssert((range.location>0)&&(range.length>0),@"range参数错误,location应该大于零,length应该大于零");
  236. [where appendFormat:@" limit %@,%@",@(range.location-1),@(range.length)];
  237. __block NSArray* results;
  238. [[BGDB shareManager] queryObjectWithTableName:tablename class:[self class] where:where complete:^(NSArray * _Nullable array) {
  239. results = array;
  240. }];
  241. //关闭数据库
  242. [[BGDB shareManager] closeDB];
  243. return results;
  244. }
  245. /**
  246. 同上条件异步.
  247. */
  248. +(void)bg_findAsync:(NSString* _Nullable)tablename range:(NSRange)range orderBy:(NSString* _Nullable)orderBy desc:(BOOL)desc complete:(bg_complete_A)complete{
  249. [[BGDB shareManager] addToThreadPool:^{
  250. NSArray* array = [self bg_find:tablename range:range orderBy:orderBy desc:desc];
  251. bg_completeBlock(array);
  252. }];
  253. }
  254. /**
  255. @tablename 当此参数为nil时,查询以此类名为表名的数据,非nil时,查询以此参数为表名的数据.
  256. @where 条件参数,可以为nil,nil时查询所有数据.
  257. 支持keyPath.
  258. where使用规则请看demo或如下事例:
  259. 1.查询name等于爸爸和age等于45,或者name等于马哥的数据. 此接口是为了方便开发者自由扩展更深层次的查询条件逻辑.
  260. where = [NSString stringWithFormat:@"where %@=%@ and %@=%@ or %@=%@",bg_sqlKey(@"age"),bg_sqlValue(@(45)),bg_sqlKey(@"name"),bg_sqlValue(@"爸爸"),bg_sqlKey(@"name"),bg_sqlValue(@"马哥")];
  261. 2.查询user.student.human.body等于小芳 和 user1.name中包含fuck这个字符串的数据.
  262. where = [NSString stringWithFormat:@"where %@",bg_keyPathValues(@[@"user.student.human.body",bg_equal,@"小芳",@"user1.name",bg_contains,@"fuck"])];
  263. 3.查询user.student.human.body等于小芳,user1.name中包含fuck这个字符串 和 name等于爸爸的数据.
  264. where = [NSString stringWithFormat:@"where %@ and %@=%@",bg_keyPathValues(@[@"user.student.human.body",bg_equal,@"小芳",@"user1.name",bg_contains,@"fuck"]),bg_sqlKey(@"name"),bg_sqlValue(@"爸爸")];
  265. */
  266. +(NSArray* _Nullable)bg_find:(NSString* _Nullable)tablename where:(NSString* _Nullable)where{
  267. if(tablename == nil) {
  268. tablename = NSStringFromClass([self class]);
  269. }
  270. __block NSArray* results;
  271. [[BGDB shareManager] queryWithTableName:tablename conditions:where complete:^(NSArray * _Nullable array) {
  272. results = [BGTool tansformDataFromSqlDataWithTableName:tablename class:[self class] array:array];
  273. }];
  274. //关闭数据库
  275. [[BGDB shareManager] closeDB];
  276. return results;
  277. }
  278. /**
  279. 同上条件异步.
  280. */
  281. +(void)bg_findAsync:(NSString* _Nullable)tablename where:(NSString* _Nullable)where complete:(bg_complete_A)complete{
  282. [[BGDB shareManager] addToThreadPool:^{
  283. NSArray* array = [self bg_find:tablename where:where];
  284. bg_completeBlock(array);
  285. }];
  286. }
  287. /**
  288. 查询某一时间段的数据.(存入时间或更新时间)
  289. @tablename 当此参数为nil时,查询以此类名为表名的数据,非nil时,查询以此参数为表名的数据.
  290. @dateTime 参数格式:
  291. 2017 即查询2017年的数据
  292. 2017-07 即查询2017年7月的数据
  293. 2017-07-19 即查询2017年7月19日的数据
  294. 2017-07-19 16 即查询2017年7月19日16时的数据
  295. 2017-07-19 16:17 即查询2017年7月19日16时17分的数据
  296. 2017-07-19 16:17:53 即查询2017年7月19日16时17分53秒的数据
  297. 2017-07-19 16:17:53.350 即查询2017年7月19日16时17分53秒350毫秒的数据
  298. */
  299. +(NSArray* _Nullable)bg_find:(NSString* _Nullable)tablename type:(bg_dataTimeType)type dateTime:(NSString* _Nonnull)dateTime{
  300. if(tablename == nil) {
  301. tablename = NSStringFromClass([self class]);
  302. }
  303. NSMutableString* like = [NSMutableString string];
  304. [like appendFormat:@"'%@",dateTime];
  305. [like appendString:@"%'"];
  306. NSString* where;
  307. if(type == bg_createTime){
  308. where = [NSString stringWithFormat:@"where %@ like %@",bg_sqlKey(bg_createTimeKey),like];
  309. }else{
  310. where = [NSString stringWithFormat:@"where %@ like %@",bg_sqlKey(bg_updateTimeKey),like];
  311. }
  312. return [self bg_find:tablename where:where];
  313. }
  314. /**
  315. @where 条件参数,不能为nil.
  316. 支持keyPath.
  317. where使用规则请看demo或如下事例:
  318. 1.将People类数据中user.student.human.body等于"小芳"的数据更新为当前对象的数据:
  319. where = [NSString stringWithFormat:@"where %@",bg_keyPathValues(@[@"user.student.human.body",bg_equal,@"小芳"])];
  320. 2.将People类中name等于"马云爸爸"的数据更新为当前对象的数据:
  321. where = [NSString stringWithFormat:@"where %@=%@",bg_sqlKey(@"name"),bg_sqlValue(@"马云爸爸")];
  322. */
  323. -(BOOL)bg_updateWhere:(NSString* _Nonnull)where{
  324. NSAssert(where && where.length,@"条件语句不能为空!");
  325. NSDictionary* valueDict = [BGTool getDictWithObject:self ignoredKeys:bg_getIgnoreKeys filtModelInfoType:bg_ModelInfoSingleUpdate];
  326. __block BOOL result;
  327. [[BGDB shareManager] updateWithObject:self valueDict:valueDict conditions:where complete:^(BOOL isSuccess) {
  328. result = isSuccess;
  329. }];
  330. //关闭数据库
  331. [[BGDB shareManager] closeDB];
  332. return result;
  333. }
  334. /**
  335. 同上条件异步.
  336. */
  337. -(void)bg_updateAsyncWhere:(NSString* _Nonnull)where complete:(bg_complete_B)complete{
  338. [[BGDB shareManager] addToThreadPool:^{
  339. BOOL flag = [self bg_updateWhere:where];
  340. bg_completeBlock(flag);
  341. }];
  342. }
  343. /**
  344. @tablename 当此参数为nil时,查询以此类名为表名的数据,非nil时,更新以此参数为表名的数据.
  345. @where 条件参数,不能为nil.
  346. 不支持keyPath.
  347. where使用规则请看demo或如下事例:
  348. 1.将People类中name等于"马云爸爸"的数据的name更新为"马化腾":
  349. where = [NSString stringWithFormat:@"set %@=%@ where %@=%@",bg_sqlKey(@"name"),bg_sqlValue(@"马化腾"),bg_sqlKey(@"name"),bg_sqlValue(@"马云爸爸")];
  350. */
  351. +(BOOL)bg_update:(NSString* _Nullable)tablename where:(NSString* _Nonnull)where{
  352. NSAssert(where && where.length,@"条件不能为空!");
  353. if(tablename == nil) {
  354. tablename = NSStringFromClass([self class]);
  355. }
  356. __block BOOL result;
  357. id object = [[self class] new];
  358. [object setBg_tableName:tablename];
  359. [[BGDB shareManager] updateWithObject:object valueDict:nil conditions:where complete:^(BOOL isSuccess) {
  360. result = isSuccess;
  361. }];
  362. //关闭数据库
  363. [[BGDB shareManager] closeDB];
  364. return result;
  365. }
  366. /**
  367. @tablename 当此参数为nil时,查询以此类名为表名的数据,非nil时,删除以此参数为表名的数据.
  368. @where 条件参数,可以为nil,nil时删除所有以tablename为表名的数据.
  369. 支持keyPath.
  370. where使用规则请看demo或如下事例:
  371. 1.删除People类中name等于"美国队长"的数据.
  372. where = [NSString stringWithFormat:@"where %@=%@",bg_sqlKey(@"name"),bg_sqlValue(@"美国队长")];
  373. 2.删除People类中user.student.human.body等于"小芳"的数据.
  374. where = [NSString stringWithFormat:@"where %@",bg_keyPathValues(@[@"user.student.human.body",bg_equal,@"小芳"])];
  375. 3.删除People类中name等于"美国队长" 和 user.student.human.body等于"小芳"的数据.
  376. where = [NSString stringWithFormat:@"where %@=%@ and %@",bg_sqlKey(@"name"),bg_sqlValue(@"美国队长"),bg_keyPathValues(@[@"user.student.human.body",bg_equal,@"小芳"])];
  377. */
  378. +(BOOL)bg_delete:(NSString* _Nullable)tablename where:(NSString* _Nullable)where{
  379. if(tablename == nil) {
  380. tablename = NSStringFromClass([self class]);
  381. }
  382. __block BOOL result;
  383. [[BGDB shareManager] deleteWithTableName:tablename conditions:where complete:^(BOOL isSuccess) {
  384. result = isSuccess;
  385. }];
  386. //关闭数据库
  387. [[BGDB shareManager] closeDB];
  388. return result;
  389. }
  390. /**
  391. 同上条件异步.
  392. */
  393. +(void)bg_deleteAsync:(NSString* _Nullable)tablename where:(NSString* _Nullable)where complete:(bg_complete_B)complete{
  394. [[BGDB shareManager] addToThreadPool:^{
  395. BOOL flag = [self bg_delete:tablename where:where];
  396. bg_completeBlock(flag);
  397. }];
  398. }
  399. /**
  400. 删除某一行数据
  401. @tablename 当此参数为nil时,查询以此类名为表名的数据,非nil时,删除以此参数为表名的数据.
  402. @row 第几行,从第1行算起.
  403. */
  404. +(BOOL)bg_delete:(NSString* _Nullable)tablename row:(NSInteger)row{
  405. NSAssert(row,@"row要大于0");
  406. if(tablename == nil) {
  407. tablename = NSStringFromClass([self class]);
  408. }
  409. NSString* where = [NSString stringWithFormat:@"where %@ in(select %@ from %@ limit 1 offset %@)",bg_rowid,bg_rowid,tablename,@(row-1)];
  410. return [self bg_delete:tablename where:where];
  411. }
  412. /**
  413. 删除第一条数据
  414. @tablename 当此参数为nil时,查询以此类名为表名的数据,非nil时,删除以此参数为表名的数据.
  415. */
  416. +(BOOL)bg_deleteFirstObject:(NSString* _Nullable)tablename{
  417. if(tablename == nil) {
  418. tablename = NSStringFromClass([self class]);
  419. }
  420. NSString* where = [NSString stringWithFormat:@"where %@ in(select %@ from %@ limit 1 offset 0)",bg_rowid,bg_rowid,tablename];
  421. return [self bg_delete:tablename where:where];
  422. }
  423. /**
  424. 删除最后一条数据
  425. @tablename 当此参数为nil时,查询以此类名为表名的数据,非nil时,删除以此参数为表名的数据.
  426. */
  427. +(BOOL)bg_deleteLastObject:(NSString* _Nullable)tablename{
  428. if(tablename == nil) {
  429. tablename = NSStringFromClass([self class]);
  430. }
  431. NSString* where = [NSString stringWithFormat:@"where %@ in(select %@ from %@ order by %@ desc limit 1 offset 0)",bg_rowid,bg_rowid,tablename,bg_rowid];
  432. return [self bg_delete:tablename where:where];
  433. }
  434. /**
  435. 同步清除所有数据
  436. @tablename 当此参数为nil时,查询以此类名为表名的数据,非nil时,清除以此参数为表名的数据.
  437. */
  438. +(BOOL)bg_clear:(NSString* _Nullable)tablename{
  439. return [self bg_delete:tablename where:nil];
  440. }
  441. /**
  442. 同上条件异步.
  443. */
  444. +(void)bg_clearAsync:(NSString* _Nullable)tablename complete:(bg_complete_B)complete{
  445. [[BGDB shareManager] addToThreadPool:^{
  446. BOOL flag = [self bg_delete:tablename where:nil];
  447. bg_completeBlock(flag);
  448. }];
  449. }
  450. /**
  451. 同步删除这个类的数据表.
  452. @tablename 当此参数为nil时,查询以此类名为表名的数据,非nil时,清除以此参数为表名的数据.
  453. */
  454. +(BOOL)bg_drop:(NSString* _Nullable)tablename{
  455. if(tablename == nil) {
  456. tablename = NSStringFromClass([self class]);
  457. }
  458. __block BOOL result;
  459. [[BGDB shareManager] dropWithTableName:tablename complete:^(BOOL isSuccess) {
  460. result = isSuccess;
  461. }];
  462. //关闭数据库
  463. [[BGDB shareManager] closeDB];
  464. return result;
  465. }
  466. /**
  467. 同上条件异步.
  468. */
  469. +(void)bg_dropAsync:(NSString* _Nullable)tablename complete:(bg_complete_B)complete{
  470. [[BGDB shareManager] addToThreadPool:^{
  471. BOOL flag = [self bg_drop:tablename];
  472. bg_completeBlock(flag);
  473. }];
  474. }
  475. /**
  476. 查询该表中有多少条数据.
  477. @tablename 当此参数为nil时,查询以此类名为表名的数据条数,非nil时,查询以此参数为表名的数据条数.
  478. @where 条件参数,nil时查询所有以tablename为表名的数据条数.
  479. 支持keyPath.
  480. 使用规则请看demo或如下事例:
  481. 1.查询People类中name等于"美国队长"的数据条数.
  482. where = [NSString stringWithFormat:@"where %@=%@",bg_sqlKey(@"name"),bg_sqlValue(@"美国队长")];
  483. 2.查询People类中user.student.human.body等于"小芳"的数据条数.
  484. where = [NSString stringWithFormat:@"where %@",bg_keyPathValues(@[@"user.student.human.body",bg_equal,@"小芳"])];
  485. 3.查询People类中name等于"美国队长" 和 user.student.human.body等于"小芳"的数据条数.
  486. where = [NSString stringWithFormat:@"where %@=%@ and %@",bg_sqlKey(@"name"),bg_sqlValue(@"美国队长"),bg_keyPathValues(@[@"user.student.human.body",bg_equal,@"小芳"])];
  487. */
  488. +(NSInteger)bg_count:(NSString* _Nullable)tablename where:(NSString* _Nullable)where{
  489. if(tablename == nil) {
  490. tablename = NSStringFromClass([self class]);
  491. }
  492. NSInteger count = [[BGDB shareManager] countForTable:tablename conditions:where];
  493. //关闭数据库
  494. [[BGDB shareManager] closeDB];
  495. return count;
  496. }
  497. /**
  498. 直接调用sqliteb的原生函数计算sun,min,max,avg等.
  499. @tablename 当此参数为nil时,操作以此类名为表名的数据表,非nil时,操作以此参数为表名的数据表.
  500. @key -> 要操作的属性,不支持keyPath.
  501. @where -> 条件参数,支持keyPath.
  502. */
  503. +(double)bg_sqliteMethodWithTableName:(NSString* _Nullable)tablename type:(bg_sqliteMethodType)methodType key:(NSString* _Nonnull)key where:(NSString* _Nullable)where{
  504. if(tablename == nil) {
  505. tablename = NSStringFromClass([self class]);
  506. }
  507. double num = [[BGDB shareManager] sqliteMethodForTable:tablename type:methodType key:key where:where];
  508. //关闭数据库
  509. [[BGDB shareManager] closeDB];
  510. return num;
  511. }
  512. /**
  513. 获取数据表当前版本号.
  514. @tablename 当此参数为nil时,操作以此类名为表名的数据表,非nil时,操作以此参数为表名的数据表.
  515. */
  516. +(NSInteger)bg_version:(NSString* _Nullable)tablename{
  517. if(tablename == nil) {
  518. tablename = NSStringFromClass([self class]);
  519. }
  520. return [BGTool getIntegerWithKey:tablename];
  521. }
  522. /**
  523. 刷新,当类'唯一约束','联合主键','属性类型'发生改变时,调用此接口刷新一下.
  524. 同步刷新.
  525. @tablename 当此参数为nil时,操作以此类名为表名的数据表,非nil时,操作以此参数为表名的数据表.
  526. @version 版本号,从1开始,依次往后递增.
  527. 说明: 本次更新版本号不得 低于或等于 上次的版本号,否则不会更新.
  528. */
  529. +(bg_dealState)bg_update:(NSString* _Nullable)tablename version:(NSInteger)version{
  530. if(tablename == nil) {
  531. tablename = NSStringFromClass([self class]);
  532. }
  533. NSInteger oldVersion = [BGTool getIntegerWithKey:tablename];
  534. if(version > oldVersion){
  535. [BGTool setIntegerWithKey:tablename value:version];
  536. NSArray* keys = [BGTool bg_filtCreateKeys:[BGTool getClassIvarList:[self class] Object:nil onlyKey:NO] ignoredkeys:bg_getIgnoreKeys];
  537. __block bg_dealState state;
  538. [[BGDB shareManager] refreshTable:tablename class:[self class] keys:keys complete:^(bg_dealState result) {
  539. state = result;
  540. }];
  541. //关闭数据库
  542. [[BGDB shareManager] closeDB];
  543. return state;
  544. }else{
  545. return bg_error;
  546. }
  547. }
  548. /**
  549. 同上条件异步.
  550. */
  551. +(void)bg_updateAsync:(NSString* _Nullable)tablename version:(NSInteger)version complete:(bg_complete_I)complete{
  552. if(tablename == nil) {
  553. tablename = NSStringFromClass([self class]);
  554. }
  555. NSInteger oldVersion = [BGTool getIntegerWithKey:tablename];
  556. if(version > oldVersion){
  557. [BGTool setIntegerWithKey:tablename value:version];
  558. [[BGDB shareManager] addToThreadPool:^{
  559. bg_dealState state = [self bg_update:tablename version:version];
  560. bg_completeBlock(state);
  561. }];
  562. }else{
  563. bg_completeBlock(bg_error);;
  564. }
  565. }
  566. /**
  567. 刷新,当类'唯一约束','联合主键','属性类型'发生改变时,调用此接口刷新一下.
  568. 同步刷新.
  569. @tablename 当此参数为nil时,操作以此类名为表名的数据表,非nil时,操作以此参数为表名的数据表.
  570. @version 版本号,从1开始,依次往后递增.
  571. @keyDict 拷贝的对应key集合,形式@{@"新Key1":@"旧Key1",@"新Key2":@"旧Key2"},即将本类以前的变量 “旧Key1” 的数据拷贝给现在本类的变量“新Key1”,其他依此推类.
  572. (特别提示: 这里只要写那些改变了的变量名就可以了,没有改变的不要写),比如A以前有3个变量,分别为a,b,c;现在变成了a,b,d;那只要写@{@"d":@"c"}就可以了,即只写变化了的变量名映射集合.
  573. 说明: 本次更新版本号不得 低于或等于 上次的版本号,否则不会更新.
  574. */
  575. +(bg_dealState)bg_update:(NSString* _Nullable)tablename version:(NSInteger)version keyDict:(NSDictionary* const _Nonnull)keydict{
  576. if(tablename == nil) {
  577. tablename = NSStringFromClass([self class]);
  578. }
  579. NSInteger oldVersion = [BGTool getIntegerWithKey:tablename];
  580. if(version > oldVersion){
  581. [BGTool setIntegerWithKey:tablename value:version];
  582. NSArray* keys = [BGTool bg_filtCreateKeys:[BGTool getClassIvarList:[self class] Object:nil onlyKey:NO] ignoredkeys:bg_getIgnoreKeys];
  583. __block bg_dealState state;
  584. [[BGDB shareManager] refreshTable:tablename class:[self class] keys:keys keyDict:keydict complete:^(bg_dealState result) {
  585. state = result;
  586. }];
  587. //关闭数据库
  588. [[BGDB shareManager] closeDB];
  589. return state;
  590. }else{
  591. return bg_error;
  592. }
  593. }
  594. /**
  595. 同上条件异步.
  596. */
  597. +(void)bg_updateAsync:(NSString* _Nullable)tablename version:(NSInteger)version keyDict:(NSDictionary* const _Nonnull)keydict complete:(bg_complete_I)complete{
  598. if(tablename == nil) {
  599. tablename = NSStringFromClass([self class]);
  600. }
  601. NSInteger oldVersion = [BGTool getIntegerWithKey:tablename];
  602. if(version > oldVersion){
  603. [BGTool setIntegerWithKey:tablename value:version];
  604. [[BGDB shareManager] addToThreadPool:^{
  605. bg_dealState state = [self bg_update:tablename version:version keyDict:keydict];
  606. bg_completeBlock(state);
  607. }];
  608. }else{
  609. bg_completeBlock(bg_error);;
  610. }
  611. }
  612. /**
  613. 将某表的数据拷贝给另一个表
  614. 同步复制.
  615. @tablename 源表名,当此参数为nil时,操作以此类名为表名的数据表,非nil时,操作以此参数为表名的数据表.
  616. @destCla 目标表名.
  617. @keyDict 拷贝的对应key集合,形式@{@"srcKey1":@"destKey1",@"srcKey2":@"destKey2"},即将源类srcCla中的变量值拷贝给目标类destCla中的变量destKey1,srcKey2和destKey2同理对应,依此推类.
  618. @append YES: 不会覆盖destCla的原数据,在其末尾继续添加;NO: 覆盖掉destCla原数据,即将原数据删掉,然后将新数据拷贝过来.
  619. */
  620. +(bg_dealState)bg_copy:(NSString* _Nullable)tablename toTable:(NSString* _Nonnull)destTable keyDict:(NSDictionary* const _Nonnull)keydict append:(BOOL)append{
  621. if(tablename == nil) {
  622. tablename = NSStringFromClass([self class]);
  623. }
  624. __block bg_dealState state;
  625. [[BGDB shareManager] copyTable:tablename to:destTable keyDict:keydict append:append complete:^(bg_dealState result) {
  626. state = result;
  627. }];
  628. //关闭数据库
  629. [[BGDB shareManager] closeDB];
  630. return state;
  631. }
  632. /**
  633. 同上条件异步.
  634. */
  635. +(void)bg_copyAsync:(NSString* _Nullable)tablename toTable:(NSString* _Nonnull)destTable keyDict:(NSDictionary* const _Nonnull)keydict append:(BOOL)append complete:(bg_complete_I)complete{
  636. if(tablename == nil) {
  637. tablename = NSStringFromClass([self class]);
  638. }
  639. [[BGDB shareManager] addToThreadPool:^{
  640. bg_dealState state = [self bg_copy:tablename toTable:destTable keyDict:keydict append:append];
  641. bg_completeBlock(state);
  642. }];
  643. }
  644. /**
  645. 注册数据库表变化监听.
  646. @tablename 表名称,当此参数为nil时,监听以当前类名为表名的数据表,当此参数非nil时,监听以此参数为表名的数据表。
  647. @identify 唯一标识,,此字符串唯一,不可重复,移除监听的时候使用此字符串移除.
  648. @return YES: 注册监听成功; NO: 注册监听失败.
  649. */
  650. +(BOOL)bg_registerChangeForTableName:(NSString* _Nullable)tablename identify:(NSString* _Nonnull)identify block:(bg_changeBlock)block{
  651. NSAssert(identify && identify.length,@"唯一标识不能为空!");
  652. if (tablename == nil) {
  653. tablename = NSStringFromClass([self class]);
  654. }
  655. tablename = [NSString stringWithFormat:@"%@*%@",tablename,identify];
  656. return [[BGDB shareManager] registerChangeWithName:tablename block:block];
  657. }
  658. /**
  659. 移除数据库表变化监听.
  660. @tablename 表名称,当此参数为nil时,监听以当前类名为表名的数据表,当此参数非nil时,监听以此参数为表名的数据表。
  661. @identify 唯一标识,,此字符串唯一,不可重复,移除监听的时候使用此字符串移除.
  662. @return YES: 移除监听成功; NO: 移除监听失败.
  663. */
  664. +(BOOL)bg_removeChangeForTableName:(NSString* _Nullable)tablename identify:(NSString* _Nonnull)identify{
  665. NSAssert(identify && identify.length,@"唯一标识不能为空!");
  666. if (tablename == nil) {
  667. tablename = NSStringFromClass([self class]);
  668. }
  669. tablename = [NSString stringWithFormat:@"%@*%@",tablename,identify];
  670. return [[BGDB shareManager] removeChangeWithName:tablename];
  671. }
  672. /**
  673. 直接执行sql语句;
  674. @tablename nil时以cla类名为表名.
  675. @cla 要操作的类,nil时返回的结果是字典.
  676. 提示:字段名要增加BG_前缀
  677. */
  678. extern id _Nullable bg_executeSql(NSString* _Nonnull sql,NSString* _Nullable tablename,__unsafe_unretained _Nullable Class cla){
  679. if (tablename == nil) {
  680. tablename = NSStringFromClass(cla);
  681. }
  682. id result = [[BGDB shareManager] bg_executeSql:sql tablename:tablename class:cla];
  683. //关闭数据库
  684. [[BGDB shareManager] closeDB];
  685. return result;
  686. }
  687. #pragma mark 下面附加字典转模型API,简单好用,在只需要字典转模型功能的情况下,可以不必要再引入MJExtension那么多文件,造成代码冗余,缩减安装包.
  688. /**
  689. 字典转模型.
  690. @keyValues 字典(NSDictionary)或json格式字符.
  691. 说明:如果模型中有数组且存放的是自定义的类(NSString等系统自带的类型就不必要了),那就实现objectClassInArray这个函数返回一个字典,key是数组名称,value是自定的类Class,用法跟MJExtension一样.
  692. */
  693. +(id)bg_objectWithKeyValues:(id)keyValues{
  694. return [BGTool bg_objectWithClass:[self class] value:keyValues];
  695. }
  696. +(id)bg_objectWithDictionary:(NSDictionary *)dictionary{
  697. return [BGTool bg_objectWithClass:[self class] value:dictionary];
  698. }
  699. /**
  700. 直接传数组批量处理;
  701. 注:array中的元素是字典,否则出错.
  702. */
  703. +(NSArray* _Nonnull)bg_objectArrayWithKeyValuesArray:(NSArray* const _Nonnull)array{
  704. NSMutableArray* results = [NSMutableArray array];
  705. for (id value in array) {
  706. id obj = [BGTool bg_objectWithClass:[self class] value:value];
  707. [results addObject:obj];
  708. }
  709. return results;
  710. }
  711. /**
  712. 模型转字典.
  713. @ignoredKeys 忽略掉模型中的哪些key(即模型变量)不要转,nil时全部转成字典.
  714. */
  715. -(NSMutableDictionary*)bg_keyValuesIgnoredKeys:(NSArray*)ignoredKeys{
  716. return [BGTool bg_keyValuesWithObject:self ignoredKeys:ignoredKeys];
  717. }
  718. #warning mark 过期方法(能正常使用,但不建议使用)
  719. /**
  720. 判断这个类的数据表是否已经存在.
  721. */
  722. +(BOOL)bg_isExist{
  723. BOOL result = [[BGDB shareManager] bg_isExistWithTableName:NSStringFromClass([self class])];
  724. //关闭数据库
  725. [[BGDB shareManager] closeDB];
  726. return result;
  727. }
  728. /**
  729. 同步存入对象数组.
  730. @array 存放对象的数组.(数组中存放的是同一种类型的数据)
  731. */
  732. +(BOOL)bg_saveArray:(NSArray* _Nonnull)array{
  733. return [self bg_saveArray:array IgnoreKeys:bg_getIgnoreKeys];
  734. }
  735. /**
  736. 同上条件异步.
  737. */
  738. +(void)bg_saveArrayAsync:(NSArray* _Nonnull)array complete:(bg_complete_B)complete{
  739. [self bg_saveArrayAsync:array IgnoreKeys:bg_getIgnoreKeys complete:complete];
  740. }
  741. /**
  742. 同步更新对象数组.
  743. @array 存放对象的数组.(数组中存放的是同一种类型的数据).
  744. 当类中定义了"唯一约束" 或 "主键"有值时,使用此API才有意义.
  745. 提示:“唯一约束”优先级高于"主键".
  746. */
  747. +(BOOL)bg_updateArray:(NSArray* _Nonnull)array{
  748. NSAssert(array && array.count,@"数组没有元素!");
  749. __block BOOL result;
  750. [[BGDB shareManager] updateObjects:array ignoredKeys:bg_getIgnoreKeys complete:^(BOOL isSuccess) {
  751. result = isSuccess;
  752. }];
  753. //关闭数据库
  754. [[BGDB shareManager] closeDB];
  755. return result;
  756. }
  757. /**
  758. 同上条件异步.
  759. */
  760. +(void)bg_updateArrayAsync:(NSArray* _Nonnull)array complete:(bg_complete_B)complete{
  761. NSAssert(array && array.count,@"数组没有元素!");
  762. dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0), ^{
  763. [[BGDB shareManager] updateObjects:array ignoredKeys:bg_getIgnoreKeys complete:complete];
  764. });
  765. }
  766. /**
  767. 同步存入对象数组.
  768. @array 存放对象的数组.(数组中存放的是同一种类型的数据)
  769. */
  770. +(BOOL)bg_saveArray:(NSArray*)array IgnoreKeys:(NSArray* const _Nullable)ignoreKeys{
  771. NSAssert(array && array.count,@"数组没有元素!");
  772. __block BOOL result = YES;
  773. [[BGDB shareManager] saveObjects:array ignoredKeys:ignoreKeys complete:^(BOOL isSuccess) {
  774. result = isSuccess;
  775. }];
  776. //关闭数据库
  777. [[BGDB shareManager] closeDB];
  778. return result;
  779. }
  780. /**
  781. 异步存入对象数组.
  782. @array 存放对象的数组.(数组中存放的是同一种类型的数据)
  783. */
  784. +(void)bg_saveArrayAsync:(NSArray*)array IgnoreKeys:(NSArray* const _Nullable)ignoreKeys complete:(bg_complete_B)complete{
  785. NSAssert(array && array.count,@"数组没有元素!");
  786. dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0), ^{
  787. BOOL flag = [self bg_saveArray:array IgnoreKeys:ignoreKeys];
  788. bg_completeBlock(flag);
  789. });
  790. }
  791. /**
  792. 同步存储.
  793. @ignoreKeys 忽略掉模型中的哪些key(即模型变量)不要存储.
  794. */
  795. -(BOOL)bg_saveIgnoredKeys:(NSArray* const _Nonnull)ignoredKeys{
  796. __block BOOL result;
  797. [[BGDB shareManager] saveObject:self ignoredKeys:ignoredKeys complete:^(BOOL isSuccess) {
  798. result = isSuccess;
  799. }];
  800. //关闭数据库
  801. [[BGDB shareManager] closeDB];
  802. return result;
  803. }
  804. /**
  805. 异步存储.
  806. @ignoreKeys 忽略掉模型中的哪些key(即模型变量)不要存储.
  807. */
  808. -(void)bg_saveAsyncIgnoreKeys:(NSArray* const _Nonnull)ignoredKeys complete:(bg_complete_B)complete{
  809. dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0), ^{
  810. BOOL flag = [self bg_saveIgnoredKeys:ignoredKeys];
  811. bg_completeBlock(flag);
  812. });
  813. }
  814. /**
  815. 同步覆盖存储.
  816. 覆盖掉原来的数据,只存储当前的数据.
  817. @ignoreKeys 忽略掉模型中的哪些key(即模型变量)不要存储.
  818. */
  819. -(BOOL)bg_coverIgnoredKeys:(NSArray* const _Nonnull)ignoredKeys{
  820. __block BOOL result;
  821. [[BGDB shareManager] clearWithObject:self complete:nil];
  822. [[BGDB shareManager] saveObject:self ignoredKeys:ignoredKeys complete:^(BOOL isSuccess) {
  823. result = isSuccess;
  824. }];
  825. //关闭数据库
  826. [[BGDB shareManager] closeDB];
  827. return result;
  828. }
  829. /**
  830. 异步覆盖存储.
  831. 覆盖掉原来的数据,只存储当前的数据.
  832. @ignoreKeys 忽略掉模型中的哪些key(即模型变量)不要存储.
  833. */
  834. -(void)bg_coverAsyncIgnoredKeys:(NSArray* const _Nonnull)ignoredKeys complete:(bg_complete_B)complete{
  835. dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0), ^{
  836. BOOL flag = [self bg_coverIgnoredKeys:ignoredKeys];
  837. bg_completeBlock(flag);
  838. });
  839. }
  840. /**
  841. 同步更新数据.
  842. @where 条件数组,形式@[@"name",@"=",@"标哥",@"age",@"=>",@(25)],即更新name=标哥,age=>25的数据.
  843. 可以为nil,nil时更新所有数据;
  844. @ignoreKeys 忽略哪些key不用更新.
  845. 不支持keypath的key,即嵌套的自定义类, 形式如@[@"user.name",@"=",@"习大大"]暂不支持(有专门的keyPath更新接口).
  846. */
  847. -(BOOL)bg_updateWhere:(NSArray* _Nullable)where ignoreKeys:(NSArray* const _Nullable)ignoreKeys{
  848. __block BOOL result;
  849. [[BGDB shareManager] updateWithObject:self where:where ignoreKeys:ignoreKeys complete:^(BOOL isSuccess) {
  850. result = isSuccess;
  851. }];
  852. //关闭数据库
  853. [[BGDB shareManager] closeDB];
  854. return result;
  855. }
  856. /**
  857. @format 传入sql条件参数,语句来进行更新,方便开发者自由扩展.
  858. 支持keyPath.
  859. 使用规则请看demo或如下事例:
  860. 1.将People类数据中user.student.human.body等于"小芳"的数据更新为当前对象的数据(忽略name不要更新).
  861. NSString* conditions = [NSString stringWithFormat:@"where %@",bg_keyPathValues(@[@"user.student.human.body",bg_equal,@"小芳"])];
  862. [p bg_updateFormatSqlConditions:conditions IgnoreKeys:@[@"name"]];
  863. 2.将People类中name等于"马云爸爸"的数据更新为当前对象的数据.
  864. NSString* conditions = [NSString stringWithFormat:@"where %@=%@",bg_sqlKey(@"name"),bg_sqlValue(@"马云爸爸")])];
  865. [p bg_updateFormatSqlConditions:conditions IgnoreKeys:nil];
  866. */
  867. -(BOOL)bg_updateFormatSqlConditions:(NSString*)conditions IgnoreKeys:(NSArray* const _Nullable)ignoreKeys{
  868. __block BOOL result;
  869. [[BGDB shareManager] updateObject:self ignoreKeys:ignoreKeys conditions:conditions complete:^(BOOL isSuccess) {
  870. result = isSuccess;
  871. }];
  872. //关闭数据库
  873. [[BGDB shareManager] closeDB];
  874. return result;
  875. }
  876. /**
  877. 根据keypath更新数据.
  878. 同步更新.
  879. @keyPathValues数组,形式@[@"user.student.name",bg_equal,@"小芳",@"user.student.conten",bg_contains,@"书"]
  880. 即更新user.student.name=@"小芳" 和 user.student.content中包含@“书”这个字符串的对象.
  881. @ignoreKeys 即或略哪些key不用更新.
  882. */
  883. -(BOOL)bg_updateForKeyPathAndValues:(NSArray* _Nonnull)keyPathValues ignoreKeys:(NSArray* const _Nullable)ignoreKeys{
  884. __block BOOL result;
  885. [[BGDB shareManager] updateWithObject:self forKeyPathAndValues:keyPathValues ignoreKeys:ignoreKeys complete:^(BOOL isSuccess) {
  886. result = isSuccess;
  887. }];
  888. //关闭数据库
  889. [[BGDB shareManager] closeDB];
  890. return result;
  891. }
  892. @end
  893. #pragma mark 直接存储数组.
  894. @implementation NSArray (BGModel)
  895. /**
  896. 存储数组.
  897. @name 唯一标识名称.
  898. **/
  899. -(BOOL)bg_saveArrayWithName:(NSString* const _Nonnull)name{
  900. if([self isKindOfClass:[NSArray class]]) {
  901. __block BOOL result;
  902. [[BGDB shareManager] saveArray:self name:name complete:^(BOOL isSuccess) {
  903. result = isSuccess;
  904. }];
  905. //关闭数据库
  906. [[BGDB shareManager] closeDB];
  907. return result;
  908. }else{
  909. return NO;
  910. }
  911. }
  912. /**
  913. 添加数组元素.
  914. @name 唯一标识名称.
  915. @object 要添加的元素.
  916. */
  917. +(BOOL)bg_addObjectWithName:(NSString* const _Nonnull)name object:(id const _Nonnull)object{
  918. NSAssert(object,@"元素不能为空!");
  919. __block BOOL result;
  920. [[BGDB shareManager] saveArray:@[object] name:name complete:^(BOOL isSuccess) {
  921. result = isSuccess;
  922. }];
  923. //关闭数据库
  924. [[BGDB shareManager] closeDB];
  925. return result;
  926. }
  927. /**
  928. 获取数组元素数量.
  929. @name 唯一标识名称.
  930. */
  931. +(NSInteger)bg_countWithName:(NSString* const _Nonnull)name{
  932. NSUInteger count = [[BGDB shareManager] countForTable:name where:nil];
  933. //关闭数据库
  934. [[BGDB shareManager] closeDB];
  935. return count;
  936. }
  937. /**
  938. 查询整个数组
  939. */
  940. +(NSArray*)bg_arrayWithName:(NSString* const _Nonnull)name{
  941. __block NSMutableArray* results;
  942. [[BGDB shareManager] queryArrayWithName:name complete:^(NSArray * _Nullable array) {
  943. if(array&&array.count){
  944. results = [NSMutableArray arrayWithArray:array];
  945. }
  946. }];
  947. //关闭数据库
  948. [[BGDB shareManager] closeDB];
  949. return results;
  950. }
  951. /**
  952. 获取数组某个位置的元素.
  953. @name 唯一标识名称.
  954. @index 数组元素位置.
  955. */
  956. +(id _Nullable)bg_objectWithName:(NSString* const _Nonnull)name Index:(NSInteger)index{
  957. id resultValue = [[BGDB shareManager] queryArrayWithName:name index:index];
  958. //关闭数据库
  959. [[BGDB shareManager] closeDB];
  960. return resultValue;
  961. }
  962. /**
  963. 更新数组某个位置的元素.
  964. @name 唯一标识名称.
  965. @index 数组元素位置.
  966. */
  967. +(BOOL)bg_updateObjectWithName:(NSString* const _Nonnull)name Object:(id _Nonnull)object Index:(NSInteger)index{
  968. BOOL result = [[BGDB shareManager] updateObjectWithName:name object:object index:index];
  969. //关闭数据库
  970. [[BGDB shareManager] closeDB];
  971. return result;
  972. }
  973. /**
  974. 删除数组的某个元素.
  975. @name 唯一标识名称.
  976. @index 数组元素位置.
  977. */
  978. +(BOOL)bg_deleteObjectWithName:(NSString* const _Nonnull)name Index:(NSInteger)index{
  979. BOOL result = [[BGDB shareManager] deleteObjectWithName:name index:index];
  980. //关闭数据库
  981. [[BGDB shareManager] closeDB];
  982. return result;
  983. }
  984. /**
  985. 清空数组元素.
  986. @name 唯一标识名称.
  987. */
  988. +(BOOL)bg_clearArrayWithName:(NSString* const _Nonnull)name{
  989. __block BOOL result;
  990. [[BGDB shareManager] dropSafeTable:name complete:^(BOOL isSuccess) {
  991. result = isSuccess;
  992. }];
  993. //关闭数据库
  994. [[BGDB shareManager] closeDB];
  995. return result;
  996. }
  997. @end
  998. #pragma mark 直接存储字典.
  999. @implementation NSDictionary (BGModel)
  1000. /**
  1001. 存储字典.
  1002. */
  1003. -(BOOL)bg_saveDictionary{
  1004. if([self isKindOfClass:[NSDictionary class]]) {
  1005. __block BOOL result;
  1006. [[BGDB shareManager] saveDictionary:self complete:^(BOOL isSuccess) {
  1007. result = isSuccess;
  1008. }];
  1009. //关闭数据库
  1010. [[BGDB shareManager] closeDB];
  1011. return result;
  1012. }else{
  1013. return NO;
  1014. }
  1015. }
  1016. /**
  1017. 添加字典元素.
  1018. */
  1019. +(BOOL)bg_setValue:(id const _Nonnull)value forKey:(NSString* const _Nonnull)key{
  1020. BOOL result = [[BGDB shareManager] bg_setValue:value forKey:key];
  1021. //关闭数据库
  1022. [[BGDB shareManager] closeDB];
  1023. return result;
  1024. }
  1025. /**
  1026. 更新字典元素.
  1027. */
  1028. +(BOOL)bg_updateValue:(id const _Nonnull)value forKey:(NSString* const _Nonnull)key{
  1029. BOOL result = [[BGDB shareManager] bg_updateValue:value forKey:key];
  1030. //关闭数据库
  1031. [[BGDB shareManager] closeDB];
  1032. return result;
  1033. }
  1034. /**
  1035. 遍历字典元素.
  1036. */
  1037. +(void)bg_enumerateKeysAndObjectsUsingBlock:(void (^ _Nonnull)(NSString* _Nonnull key, id _Nonnull value,BOOL *stop))block{
  1038. [[BGDB shareManager] bg_enumerateKeysAndObjectsUsingBlock:block];
  1039. //关闭数据库
  1040. [[BGDB shareManager] closeDB];
  1041. }
  1042. /**
  1043. 获取字典元素.
  1044. */
  1045. +(id _Nullable)bg_valueForKey:(NSString* const _Nonnull)key{
  1046. id value = [[BGDB shareManager] bg_valueForKey:key];
  1047. //关闭数据库
  1048. [[BGDB shareManager] closeDB];
  1049. return value;
  1050. }
  1051. /**
  1052. 移除字典某个元素.
  1053. */
  1054. +(BOOL)bg_removeValueForKey:(NSString* const _Nonnull)key{
  1055. BOOL result = [[BGDB shareManager] bg_deleteValueForKey:key];
  1056. //关闭数据库
  1057. [[BGDB shareManager] closeDB];
  1058. return result;
  1059. }
  1060. /**
  1061. 清空字典.
  1062. */
  1063. +(BOOL)bg_clearDictionary{
  1064. __block BOOL result;
  1065. NSString* const tableName = @"BG_Dictionary";
  1066. [[BGDB shareManager] dropSafeTable:tableName complete:^(BOOL isSuccess) {
  1067. result = isSuccess;
  1068. }];
  1069. //关闭数据库
  1070. [[BGDB shareManager] closeDB];
  1071. return result;
  1072. }
  1073. @end