DBOperation.m 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260
  1. //
  2. // DBOperation.m
  3. // zhuxun
  4. //
  5. // Created by winsoft on 17/4/24.
  6. //
  7. //
  8. #import "DBOperation.h"
  9. #import <FMDB/FMDB.h>
  10. #import "DBConfigureCenter.h"
  11. #import <MJExtension/MJExtension.h>
  12. //static FMDatabaseQueue *dbqueue;
  13. @interface DBOperation()
  14. @property (nonatomic , strong) FMDatabaseQueue *dbqueue;
  15. @end
  16. @implementation DBOperation
  17. + (instancetype)dbOperationWithPath:(NSString *)path
  18. {
  19. DBOperation *dbOperation = [[DBOperation alloc]init];
  20. if (!dbOperation.dbqueue) {
  21. dbOperation.dbqueue = [FMDatabaseQueue databaseQueueWithPath:path];
  22. }
  23. return dbOperation;
  24. }
  25. - (void)creatDBbySQL:(NSString *)sql Path:(NSString *)path
  26. {
  27. [self.dbqueue inDatabase:^(FMDatabase *db) {
  28. [db executeUpdate:sql];
  29. }];
  30. //dbqueue = [FMDatabaseQueue databaseQueueWithPath:path];
  31. // if (dbqueue == nil) {
  32. // dbqueue = [FMDatabaseQueue databaseQueueWithPath:path];
  33. // }
  34. //
  35. // [dbqueue inDatabase:^(FMDatabase *db) {
  36. // [db executeUpdate:sql];
  37. //
  38. // }];
  39. }
  40. - (void)creatDBWithTableName:(NSString *)tableName dbModelClass:(Class)dbModelClass Path:(NSString *)path autoUpgrade:(BOOL)autoUpgrade uniqueCloumName:(NSString *)uniqueCloumName
  41. {
  42. NSString *sql = [DBConfigureCenter getDBTableWithTableName:tableName className:dbModelClass];
  43. [self creatDBbySQL:sql Path:path];
  44. //自动升级.
  45. if (autoUpgrade) {
  46. [self judgeCloumExistAndAutoUpdateWithTableName:tableName allCloumnName_TypeArray:[DBConfigureCenter sqlCloumnCheckWithClassName:dbModelClass]];
  47. }
  48. if (uniqueCloumName.length) {
  49. NSString *indexSql = [NSString stringWithFormat:@"create unique index %@_index_%@ on %@(%@)",tableName,uniqueCloumName,tableName,uniqueCloumName];
  50. [self addDataToDBWithSQL:indexSql];
  51. }
  52. }
  53. //自动升级.
  54. - (void)judgeCloumExistAndAutoUpdateWithTableName:(NSString *)tableName allCloumnName_TypeArray:(NSArray<DBStructModel *> *)allCloumnName_TypeArray
  55. {
  56. NSString *sql = [NSString stringWithFormat:@"pragma table_info (%@)",tableName];
  57. __weak typeof(self)weakself = self;
  58. [self quaryDBbySQL:sql result:^(NSMutableArray *array) {
  59. NSArray *dbStructArray = [DBStructModel mj_objectArrayWithKeyValuesArray:array];
  60. for (DBStructModel *dbModel in allCloumnName_TypeArray) {
  61. NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name = %@",dbModel.name];
  62. //如果name在数据库返回的字段内找不到,则插入.
  63. NSArray *targetKeyArray = [dbStructArray filteredArrayUsingPredicate:predicate];
  64. if (!targetKeyArray.count) {
  65. NSString *alertStr = [NSString stringWithFormat:@"ALTER TABLE %@ ADD %@ %@",tableName,dbModel.name,dbModel.type];
  66. [weakself addDataToDBWithSQL:alertStr];
  67. }
  68. }
  69. }];
  70. }
  71. //查询目标群组
  72. - (void)quaryDBbySQL:(NSString *)sql result:(void(^)(NSMutableArray *array))result
  73. {
  74. __block FMResultSet *rs = nil;
  75. NSMutableArray *tempArray = [NSMutableArray array];
  76. [self.dbqueue inDatabase:^(FMDatabase *db) {
  77. rs = [db executeQuery:sql];
  78. while (rs.next) {
  79. //获取nsdata
  80. // NSData *data = rs.resultDictionary ;//[rs dataForColumn:nil];
  81. // //将nsdata转成weibostatusmodel
  82. // GroupObject *groupObject = [NSKeyedUnarchiver unarchiveObjectWithData:data];
  83. // [tempArray addObject:groupObject];
  84. NSDictionary *dict = rs.resultDictionary;
  85. [tempArray addObject:dict];
  86. }
  87. }];
  88. if (tempArray.count) {
  89. result(tempArray);
  90. }else result (nil);
  91. }
  92. //插入模型
  93. - (void)addDataDBWithTableName:(NSString *)tableName model:(id)model
  94. {
  95. NSString *sql = [self getInsertModelSqlWithTableName:tableName model:model];
  96. [self addDataToDBWithSQL:sql];
  97. }
  98. - (void)addDatasDBWithTableName:(NSString *)tableName models:(NSArray *)models
  99. {
  100. NSMutableArray *tempSqlsArray = [NSMutableArray array];
  101. for (id model in models) {
  102. [tempSqlsArray addObject:[self getInsertModelSqlWithTableName:tableName model:model]];
  103. }
  104. [self addDatasToDBWithSQLs:tempSqlsArray];
  105. }
  106. - (void)addDataToDBWithSQL:(NSString *)sql
  107. {
  108. [self.dbqueue inDatabase:^(FMDatabase *db) {
  109. [db executeUpdate:sql];
  110. }];
  111. }
  112. - (void)addDatasToDBWithSQLs:(NSArray *)sqls
  113. {
  114. [self.dbqueue inDatabase:^(FMDatabase *db) {
  115. #ifdef DEBUG
  116. db.logsErrors = YES;
  117. #else
  118. db.logsErrors = NO;
  119. #endif
  120. NSLog(@"start1111111111");
  121. [db beginTransaction];
  122. @try {
  123. for (NSString *sql in sqls) {
  124. [db executeUpdate:sql];
  125. }
  126. }
  127. @catch (NSException *exception)
  128. {
  129. [db rollback];
  130. }
  131. @finally
  132. {
  133. [db commit];
  134. }
  135. NSLog(@"end1111111111");
  136. }];
  137. }
  138. - (NSString *)getInsertModelSqlWithTableName:(NSString *)tableName model:(id)model
  139. {
  140. Class cls = [model class];
  141. unsigned int ivarsCnt = 0;
  142. // 获取类成员变量列表,ivarsCnt为类成员数量
  143. Ivar *ivars = class_copyIvarList(cls, &ivarsCnt);
  144. // 遍历成员变量列表,其中每个变量都是Ivar类型的结构体
  145. int i = 0;
  146. NSMutableArray *keys = [NSMutableArray array];
  147. NSMutableArray *values = [NSMutableArray array];
  148. // NSMutableArray *valueSqlSymbol = [NSMutableArray array];
  149. for (const Ivar *p = ivars; p < ivars + ivarsCnt; ++p)
  150. {
  151. Ivar const ivar = *p;
  152. // 获取变量名
  153. NSString *key = [NSString stringWithUTF8String:ivar_getName(ivar)];
  154. // 若此变量未在类结构体中声明而只声明为Property,则变量名加前缀 '_'下划线
  155. // 比如 @property(retain) NSString *abc;则 key == _abc;
  156. // 获取变量值
  157. id value = [model valueForKey:key];
  158. // id value = [self valueForKey:key];
  159. // 取得变量类型
  160. // 通过 type[0]可以判断其具体的内置类型
  161. // const char *type = ivar_getTypeEncoding(ivar);
  162. if(value)
  163. {
  164. BOOL strValue = NO;
  165. if ([value isKindOfClass:[NSString class]]) {
  166. strValue = YES;
  167. NSString *strValue = value;
  168. if (!strValue.length) {
  169. continue;
  170. }
  171. }
  172. [keys addObject:[key substringFromIndex:1]];
  173. //字符串需要新增一个'',如果是字典对象呢?
  174. if (strValue) {
  175. [values addObject:[NSString stringWithFormat:@"'%@'",value]];
  176. }else [values addObject:value];
  177. // [valueSqlSymbol addObject:@"?"];
  178. }
  179. i++;
  180. }
  181. free(ivars);
  182. NSString *fileKeyListStr = [keys componentsJoinedByString:@","];
  183. NSString *fileValueListStr = [values componentsJoinedByString:@","];
  184. NSString *SQL = [NSString stringWithFormat:@"insert into %@ (%@) values(%@)",tableName,fileKeyListStr,fileValueListStr];
  185. return SQL;
  186. }
  187. @end