PageRenderTime 95ms CodeModel.GetById 1ms RepoModel.GetById 0ms app.codeStats 0ms

/TeamTalk/IOSDuoduo/Module/DataBase/DDDatabaseUtil.m

https://gitlab.com/lisit1003/TTiOSClient
Objective C | 763 lines | 673 code | 69 blank | 21 comment | 48 complexity | 02f2b82f418381170315b4d7b1f45584 MD5 | raw file
  1. // DDDatabaseUtil.m
  2. // Duoduo
  3. //
  4. // Created by zuoye on 14-3-21.
  5. // Copyright (c) 2014年 zuoye. All rights reserved.
  6. //
  7. #import "DDDatabaseUtil.h"
  8. #import "DDMessageEntity.h"
  9. #import "DDUserEntity.h"
  10. #import "DDUserModule.h"
  11. #import "DDGroupEntity.h"
  12. #import "NSString+DDPath.h"
  13. #import "NSDictionary+Safe.h"
  14. #import "DDepartment.h"
  15. #define DB_FILE_NAME @"Duoduo.sqlite"
  16. #define TABLE_MESSAGE @"message"
  17. #define TABLE_RECENT_CONTACTS @"recentContacts"
  18. #define TABLE_ALL_CONTACTS @"allContacts"
  19. #define TABLE_DEPARTMENTS @"departments"
  20. #define TABLE_RECENT_GROUPS @"recentGroups"
  21. #define SQL_CREATE_MESSAGE [NSString stringWithFormat:@"CREATE TABLE IF NOT EXISTS %@ (messageID text primary key,sessionId text,fromUserId text,toUserId text,content text, status integer, msgTime real, sessionType integer,messageContentType integer,messageType integer,info text,reserve1 integer,reserve2 text)",TABLE_MESSAGE]
  22. #define SQL_CREATE_MESSAGE_INDEX [NSString stringWithFormat:@"CREATE INDEX sessionId on %@(sessionId)",TABLE_MESSAGE]
  23. #define SQL_CREATE_RECENT_CONTACTS [NSString stringWithFormat:@"CREATE TABLE IF NOT EXISTS %@ (ID text UNIQUE,Name text,Nick text,Avatar text, Role integer, updated real,reserve1 integer,reserve2 text)",TABLE_RECENT_CONTACTS]
  24. #define SQL_CREATE_DEPARTMENTS [NSString stringWithFormat:@"CREATE TABLE IF NOT EXISTS %@ (ID text UNIQUE,parentID text,title text, description text,leader text, status integer,count integer)",TABLE_DEPARTMENTS]
  25. #define SQL_CREATE_ALL_CONTACTS [NSString stringWithFormat:@"CREATE TABLE IF NOT EXISTS %@ (ID text UNIQUE,Name text,Nick text,Avatar text, Title text, Department text,DepartID text, Email text,Postion text,Role integer, JobNum integer,Telphone text,Sex integer,updated real)",TABLE_ALL_CONTACTS]
  26. #define SQL_CREATE_RECENT_GROUPS [NSString stringWithFormat:@"CREATE TABLE IF NOT EXISTS %@ (ID text UNIQUE,Avatar text, GroupType integer, Name text,CreatID text,Users Text,LastMessage Text,updated real,isshield integer)",TABLE_RECENT_GROUPS]
  27. #define SQL_CREATE_CONTACTS_INDEX [NSString stringWithFormat:@"CREATE UNIQUE ID on %@(ID)",TABLE_ALL_CONTACTS]
  28. @implementation DDDatabaseUtil
  29. {
  30. FMDatabase* _database;
  31. FMDatabaseQueue* _dataBaseQueue;
  32. }
  33. + (instancetype)instance
  34. {
  35. static DDDatabaseUtil* g_databaseUtil;
  36. static dispatch_once_t onceToken;
  37. dispatch_once(&onceToken, ^{
  38. g_databaseUtil = [[DDDatabaseUtil alloc] init];
  39. [NSString stringWithFormat:@""];
  40. });
  41. return g_databaseUtil;
  42. }
  43. - (id)init
  44. {
  45. self = [super init];
  46. if (self)
  47. {
  48. //初始化数据库
  49. [self openCurrentUserDB];
  50. }
  51. return self;
  52. }
  53. - (void)openCurrentUserDB
  54. {
  55. if (_database)
  56. {
  57. [_database close];
  58. _database = nil;
  59. }
  60. _dataBaseQueue = [FMDatabaseQueue databaseQueueWithPath:[DDDatabaseUtil dbFilePath]];
  61. _database = [FMDatabase databaseWithPath:[DDDatabaseUtil dbFilePath]];
  62. if (![_database open])
  63. {
  64. DDLog(@"打开数据库失败");
  65. }
  66. else
  67. {
  68. //创建
  69. [_dataBaseQueue inDatabase:^(FMDatabase *db) {
  70. if (![_database tableExists:TABLE_MESSAGE])
  71. {
  72. [self createTable:SQL_CREATE_MESSAGE];
  73. }
  74. if (![_database tableExists:TABLE_RECENT_CONTACTS])
  75. {
  76. [self createTable:SQL_CREATE_RECENT_CONTACTS];
  77. }
  78. if (![_database tableExists:TABLE_DEPARTMENTS])
  79. {
  80. [self createTable:SQL_CREATE_DEPARTMENTS];
  81. }
  82. if (![_database tableExists:TABLE_ALL_CONTACTS]) {
  83. [self createTable:SQL_CREATE_ALL_CONTACTS];
  84. }
  85. if (![_database tableExists:SQL_CREATE_RECENT_GROUPS]) {
  86. [self createTable:SQL_CREATE_RECENT_GROUPS];
  87. }
  88. }];
  89. }
  90. }
  91. +(NSString *)dbFilePath
  92. {
  93. NSString* directorPath = [NSString userExclusiveDirection];
  94. NSFileManager* fileManager = [NSFileManager defaultManager];
  95. //改用户的db是否存在,若不存在则创建相应的DB目录
  96. BOOL isDirector = NO;
  97. BOOL isExiting = [fileManager fileExistsAtPath:directorPath isDirectory:&isDirector];
  98. if (!(isExiting && isDirector))
  99. {
  100. BOOL createDirection = [fileManager createDirectoryAtPath:directorPath
  101. withIntermediateDirectories:YES
  102. attributes:nil
  103. error:nil];
  104. if (!createDirection)
  105. {
  106. DDLog(@"创建DB目录失败");
  107. }
  108. }
  109. NSString *dbPath = [directorPath stringByAppendingPathComponent:DB_FILE_NAME];
  110. return dbPath;
  111. }
  112. -(BOOL)createTable:(NSString *)sql //创建表
  113. {
  114. BOOL result = NO;
  115. [_database setShouldCacheStatements:YES];
  116. NSString *tempSql = [NSString stringWithFormat:@"%@",sql];
  117. result = [_database executeUpdate:tempSql];
  118. [_database executeUpdate:SQL_CREATE_MESSAGE_INDEX];
  119. //BOOL dd =[_database executeUpdate:SQL_CREATE_CONTACTS_INDEX];
  120. return result;
  121. }
  122. -(BOOL)clearTable:(NSString *)tableName
  123. {
  124. BOOL result = NO;
  125. [_database setShouldCacheStatements:YES];
  126. NSString *tempSql = [NSString stringWithFormat:@"DELETE FROM %@",tableName];
  127. result = [_database executeUpdate:tempSql];
  128. // [_database executeUpdate:SQL_CREATE_MESSAGE_INDEX];
  129. // //BOOL dd =[_database executeUpdate:SQL_CREATE_CONTACTS_INDEX];
  130. //
  131. return result;
  132. }
  133. - (DDMessageEntity*)messageFromResult:(FMResultSet*)resultSet
  134. {
  135. NSString* sessionID = [resultSet stringForColumn:@"sessionId"];
  136. NSString* fromUserId = [resultSet stringForColumn:@"fromUserId"];
  137. NSString* toUserId = [resultSet stringForColumn:@"toUserId"];
  138. NSString* content = [resultSet stringForColumn:@"content"];
  139. NSUInteger msgTime = [resultSet longForColumn:@"msgTime"];
  140. NSUInteger messageType = [resultSet intForColumn:@"messageType"];
  141. NSUInteger messageContentType = [resultSet intForColumn:@"messageContentType"];
  142. NSString * messageID = [resultSet stringForColumn:@"messageID"];
  143. NSUInteger messageState = [resultSet intForColumn:@"status"];
  144. DDMessageEntity* messageEntity = [[DDMessageEntity alloc] initWithMsgID:messageID
  145. msgType:messageType
  146. msgTime:msgTime
  147. sessionID:sessionID
  148. senderID:fromUserId
  149. msgContent:content
  150. toUserID:toUserId];
  151. messageEntity.state = messageState;
  152. messageEntity.msgContentType = messageContentType;
  153. NSString* infoString = [resultSet stringForColumn:@"info"];
  154. if (infoString)
  155. {
  156. NSData* infoData = [infoString dataUsingEncoding:NSUTF8StringEncoding];
  157. NSDictionary* info = [NSJSONSerialization JSONObjectWithData:infoData options:0 error:nil];
  158. NSMutableDictionary* mutalInfo = [NSMutableDictionary dictionaryWithDictionary:info];
  159. messageEntity.info = mutalInfo;
  160. }
  161. return messageEntity;
  162. }
  163. - (DDUserEntity*)userFromResult:(FMResultSet*)resultSet
  164. {
  165. NSMutableDictionary *dic = [NSMutableDictionary new];
  166. [dic safeSetObject:[resultSet stringForColumn:@"Name"] forKey:@"name"];
  167. [dic safeSetObject:[resultSet stringForColumn:@"Nick"] forKey:@"nickName"];
  168. [dic safeSetObject:[resultSet stringForColumn:@"ID"] forKey:@"userId"];
  169. [dic safeSetObject:[resultSet stringForColumn:@"Department"] forKey:@"department"];
  170. [dic safeSetObject:[resultSet stringForColumn:@"Title"] forKey:@"title"];
  171. [dic safeSetObject:[resultSet stringForColumn:@"Postion"] forKey:@"position"];
  172. [dic safeSetObject:[NSNumber numberWithInt:[resultSet intForColumn:@"Sex"]] forKey:@"sex"];
  173. [dic safeSetObject:[NSNumber numberWithInt:[resultSet intForColumn:@"Role"]] forKey:@"roleStatus"];
  174. [dic safeSetObject:[resultSet stringForColumn:@"DepartID"] forKey:@"departId"];
  175. [dic safeSetObject:[resultSet stringForColumn:@"JobNum"] forKey:@"jobNum"];
  176. [dic safeSetObject:[resultSet stringForColumn:@"Telphone"] forKey:@"telphone"];
  177. [dic safeSetObject:[resultSet stringForColumn:@"Avatar"] forKey:@"avatar"];
  178. [dic safeSetObject:[resultSet stringForColumn:@"Email"] forKey:@"email"];
  179. [dic safeSetObject:@([resultSet longForColumn:@"updated"]) forKey:@"lastUpdateTime"];
  180. DDUserEntity* user = [DDUserEntity dicToUserEntity:dic];
  181. return user;
  182. }
  183. -(DDGroupEntity *)groupFromResult:(FMResultSet *)resultSet
  184. {
  185. NSMutableDictionary *dic = [NSMutableDictionary new];
  186. [dic safeSetObject:[resultSet stringForColumn:@"Name"] forKey:@"name"];
  187. [dic safeSetObject:[resultSet stringForColumn:@"ID"] forKey:@"groupId"];
  188. [dic safeSetObject:[resultSet stringForColumn:@"Avatar"] forKey:@"avatar"];
  189. [dic safeSetObject:[NSNumber numberWithInt:[resultSet intForColumn:@"GroupType"]] forKey:@"groupType"];
  190. [dic safeSetObject:@([resultSet longForColumn:@"updated"]) forKey:@"lastUpdateTime"];
  191. [dic safeSetObject:[resultSet stringForColumn:@"CreatID"] forKey:@"creatID"];
  192. [dic safeSetObject:[resultSet stringForColumn:@"Users"] forKey:@"Users"];
  193. [dic safeSetObject:[resultSet stringForColumn:@"LastMessage"] forKey:@"lastMessage"];
  194. [dic safeSetObject:[NSNumber numberWithInt:[resultSet intForColumn:@"isshield"]] forKey:@"isshield"];
  195. DDGroupEntity* group = [DDGroupEntity dicToGroupEntity:dic];
  196. return group;
  197. }
  198. - (DDepartment*)departmentFromResult:(FMResultSet*)resultSet
  199. {
  200. NSDictionary *dic = @{@"departID": [resultSet stringForColumn:@"ID"],
  201. @"title":[resultSet stringForColumn:@"title"],
  202. @"description":[resultSet stringForColumn:@"description"],
  203. @"leader":[resultSet stringForColumn:@"leader"],
  204. @"parentID":[resultSet stringForColumn:@"parentID"],
  205. @"status":[NSNumber numberWithInt:[resultSet intForColumn:@"status"]],
  206. @"count":[NSNumber numberWithInt:[resultSet intForColumn:@"count"]],
  207. };
  208. DDepartment *deaprtment = [DDepartment departmentFromDic:dic];
  209. return deaprtment;
  210. }
  211. #pragma mark Message
  212. - (void)loadMessageForSessionID:(NSString*)sessionID pageCount:(int)pagecount index:(NSInteger)index completion:(LoadMessageInSessionCompletion)completion
  213. {
  214. [_dataBaseQueue inDatabase:^(FMDatabase *db) {
  215. NSMutableArray* array = [[NSMutableArray alloc] init];
  216. if ([_database tableExists:TABLE_MESSAGE])
  217. {
  218. [_database setShouldCacheStatements:YES];
  219. NSString* sqlString = [NSString stringWithFormat:@"SELECT * FROM message where sessionId=? ORDER BY msgTime DESC,messageID DESC limit ?,?"];
  220. FMResultSet* result = [_database executeQuery:sqlString,sessionID,[NSNumber numberWithInteger:index],[NSNumber numberWithInteger:pagecount]];
  221. while ([result next])
  222. {
  223. DDMessageEntity* message = [self messageFromResult:result];
  224. [array addObject:message];
  225. }
  226. dispatch_async(dispatch_get_main_queue(), ^{
  227. completion(array,nil);
  228. });
  229. }
  230. }];
  231. }
  232. - (void)loadMessageForSessionID:(NSString*)sessionID afterMessage:(DDMessageEntity*)message completion:(LoadMessageInSessionCompletion)completion
  233. {
  234. [_dataBaseQueue inDatabase:^(FMDatabase *db) {
  235. NSMutableArray* array = [[NSMutableArray alloc] init];
  236. if ([_database tableExists:TABLE_MESSAGE])
  237. {
  238. [_database setShouldCacheStatements:YES];
  239. NSString* sqlString = [NSString stringWithFormat:@"select * from %@ where sessionId = ? AND messageID >= ? order by msgTime DESC,rowid DESC",TABLE_MESSAGE];
  240. FMResultSet* result = [_database executeQuery:sqlString,sessionID,message.msgID];
  241. while ([result next])
  242. {
  243. DDMessageEntity* message = [self messageFromResult:result];
  244. [array addObject:message];
  245. }
  246. dispatch_async(dispatch_get_main_queue(), ^{
  247. completion(array,nil);
  248. });
  249. }
  250. }];
  251. }
  252. - (void)getLasetCommodityTypeImageForSession:(NSString*)sessionID completion:(DDGetLastestCommodityMessageCompletion)completion
  253. {
  254. [_dataBaseQueue inDatabase:^(FMDatabase *db) {
  255. if ([_database tableExists:TABLE_MESSAGE])
  256. {
  257. [_database setShouldCacheStatements:YES];
  258. NSString* sqlString = [NSString stringWithFormat:@"SELECT * from %@ where sessionId=? AND messageType = ? ORDER BY msgTime DESC,rowid DESC limit 0,1",TABLE_MESSAGE];
  259. FMResultSet* result = [_database executeQuery:sqlString,sessionID,@(4)];
  260. DDMessageEntity* message = nil;
  261. while ([result next])
  262. {
  263. message = [self messageFromResult:result];
  264. }
  265. dispatch_async(dispatch_get_main_queue(), ^{
  266. completion(message);
  267. });
  268. }
  269. }];
  270. }
  271. - (void)getLastestMessageForSessionID:(NSString*)sessionID completion:(DDDBGetLastestMessageCompletion)completion
  272. {
  273. [_dataBaseQueue inDatabase:^(FMDatabase *db) {
  274. if ([_database tableExists:TABLE_MESSAGE])
  275. {
  276. [_database setShouldCacheStatements:YES];
  277. NSString* sqlString = [NSString stringWithFormat:@"SELECT * FROM %@ where sessionId=? ORDER BY msgTime DESC,rowid DESC limit 0,1",TABLE_MESSAGE];
  278. FMResultSet* result = [_database executeQuery:sqlString,sessionID];
  279. DDMessageEntity* message = nil;
  280. while ([result next])
  281. {
  282. message = [self messageFromResult:result];
  283. dispatch_async(dispatch_get_main_queue(), ^{
  284. completion(message,nil);
  285. });
  286. break;
  287. }
  288. }
  289. }];
  290. }
  291. - (void)getMessagesCountForSessionID:(NSString*)sessionID completion:(MessageCountCompletion)completion
  292. {
  293. [_dataBaseQueue inDatabase:^(FMDatabase *db) {
  294. if ([_database tableExists:TABLE_MESSAGE])
  295. {
  296. [_database setShouldCacheStatements:YES];
  297. NSString* sqlString = [NSString stringWithFormat:@"SELECT COUNT(*) FROM %@ where sessionId=?",TABLE_MESSAGE];
  298. FMResultSet* result = [_database executeQuery:sqlString,sessionID];
  299. int count = 0;
  300. while ([result next])
  301. {
  302. count = [result intForColumnIndex:0];
  303. }
  304. dispatch_async(dispatch_get_main_queue(), ^{
  305. completion(count);
  306. });
  307. }
  308. }];
  309. }
  310. - (void)insertMessages:(NSArray*)messages
  311. success:(void(^)())success
  312. failure:(void(^)(NSString* errorDescripe))failure
  313. {
  314. [_dataBaseQueue inDatabase:^(FMDatabase *db) {
  315. [_database beginTransaction];
  316. __block BOOL isRollBack = NO;
  317. @try {
  318. [messages enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
  319. DDMessageEntity* message = (DDMessageEntity*)obj;
  320. NSString* sql = [NSString stringWithFormat:@"INSERT OR REPLACE INTO %@ VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?)",TABLE_MESSAGE];
  321. NSData* infoJsonData = [NSJSONSerialization dataWithJSONObject:message.info options:NSJSONWritingPrettyPrinted error:nil];
  322. NSString* json = [[NSString alloc] initWithData:infoJsonData encoding:NSUTF8StringEncoding];
  323. BOOL result = [_database executeUpdate:sql,message.msgID,message.sessionId,message.senderId,message.toUserID,message.msgContent,@(message.state),@(message.msgTime),@(1),@(message.msgContentType),@(message.msgType),json,@(0),@""];
  324. if (!result)
  325. {
  326. isRollBack = YES;
  327. *stop = YES;
  328. }
  329. }];
  330. }
  331. @catch (NSException *exception) {
  332. [_database rollback];
  333. failure(@"插入数据失败");
  334. }
  335. @finally {
  336. if (isRollBack)
  337. {
  338. [_database rollback];
  339. DDLog(@"insert to database failure content");
  340. failure(@"插入数据失败");
  341. }
  342. else
  343. {
  344. [_database commit];
  345. success();
  346. }
  347. }
  348. }];
  349. }
  350. - (void)deleteMesagesForSession:(NSString*)sessionID completion:(DeleteSessionCompletion)completion
  351. {
  352. [_dataBaseQueue inDatabase:^(FMDatabase *db) {
  353. NSString* sql = @"DELETE FROM message WHERE sessionId = ?";
  354. BOOL result = [_database executeUpdate:sql,sessionID];
  355. dispatch_async(dispatch_get_main_queue(), ^{
  356. completion(result);
  357. });
  358. }];
  359. }
  360. - (void)updateMessageForMessage:(DDMessageEntity*)message completion:(DDUpdateMessageCompletion)completion
  361. {
  362. //(messageID integer,sessionId text,fromUserId text,toUserId text,content text, status integer, msgTime real, sessionType integer,messageType integer,reserve1 integer,reserve2 text)
  363. [_dataBaseQueue inDatabase:^(FMDatabase *db) {
  364. NSString* sql = [NSString stringWithFormat:@"UPDATE %@ set sessionId = ? , fromUserId = ? , toUserId = ? , content = ? , status = ? , msgTime = ? , sessionType = ? , messageType = ? ,messageContentType = ? , info = ? where messageID = ?",TABLE_MESSAGE];
  365. NSData* infoJsonData = [NSJSONSerialization dataWithJSONObject:message.info options:NSJSONWritingPrettyPrinted error:nil];
  366. NSString* json = [[NSString alloc] initWithData:infoJsonData encoding:NSUTF8StringEncoding];
  367. BOOL result = [_database executeUpdate:sql,message.sessionId,message.senderId,message.toUserID,message.msgContent,@(message.state),@(message.msgTime),@(1),@(message.msgType),@(message.msgContentType),json,message.msgID];
  368. dispatch_async(dispatch_get_main_queue(), ^{
  369. completion(result);
  370. });
  371. }];
  372. }
  373. #pragma mark - Users
  374. - (void)loadContactsCompletion:(LoadRecentContactsComplection)completion
  375. {
  376. [_dataBaseQueue inDatabase:^(FMDatabase *db) {
  377. NSMutableArray* array = [[NSMutableArray alloc] init];
  378. if ([_database tableExists:TABLE_RECENT_CONTACTS])
  379. {
  380. [_database setShouldCacheStatements:YES];
  381. NSString* sqlString = [NSString stringWithFormat:@"SELECT * FROM %@",TABLE_RECENT_CONTACTS];
  382. FMResultSet* result = [_database executeQuery:sqlString];
  383. while ([result next])
  384. {
  385. DDUserEntity* user = [self userFromResult:result];
  386. [array addObject:user];
  387. }
  388. dispatch_async(dispatch_get_main_queue(), ^{
  389. completion(array,nil);
  390. });
  391. }
  392. }];
  393. }
  394. - (void)updateContacts:(NSArray*)users inDBCompletion:(UpdateRecentContactsComplection)completion
  395. {
  396. [_dataBaseQueue inDatabase:^(FMDatabase *db) {
  397. NSString* sql = [NSString stringWithFormat:@"DELETE FROM %@",TABLE_RECENT_CONTACTS];
  398. BOOL result = [_database executeUpdate:sql];
  399. if (result)
  400. {
  401. //删除原先数据成功,添加新数据
  402. [_database beginTransaction];
  403. __block BOOL isRollBack = NO;
  404. @try {
  405. [users enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
  406. DDUserEntity* user = (DDUserEntity*)obj;
  407. NSString* sql = [NSString stringWithFormat:@"INSERT OR REPLACE INTO %@ VALUES(?,?,?,?,?,?,?,?)",TABLE_RECENT_CONTACTS];
  408. //ID,Name,Nick,Avatar,Role,updated,reserve1,reserve2
  409. BOOL result = [_database executeUpdate:sql,user.objID,user.name,user.nick,user.avatar,@(user.userRole),@(user.lastUpdateTime),@(0),@""];
  410. if (!result)
  411. {
  412. isRollBack = YES;
  413. *stop = YES;
  414. }
  415. }];
  416. }
  417. @catch (NSException *exception) {
  418. [_database rollback];
  419. }
  420. @finally {
  421. if (isRollBack)
  422. {
  423. [_database rollback];
  424. DDLog(@"insert to database failure content");
  425. NSError* error = [NSError errorWithDomain:@"插入最近联系人用户失败" code:0 userInfo:nil];
  426. completion(error);
  427. }
  428. else
  429. {
  430. [_database commit];
  431. completion(nil);
  432. }
  433. }
  434. }
  435. else
  436. {
  437. dispatch_async(dispatch_get_main_queue(), ^{
  438. NSError* error = [NSError errorWithDomain:@"清除数据失败" code:0 userInfo:nil];
  439. completion(error);
  440. });
  441. }
  442. }];
  443. }
  444. - (void)updateContact:(DDUserEntity*)user inDBCompletion:(UpdateRecentContactsComplection)completion
  445. {
  446. [_dataBaseQueue inDatabase:^(FMDatabase *db) {
  447. //#define SQL_CREATE_RECENT_CONTACTS [NSString stringWithFormat:@"CREATE TABLE IF NOT EXISTS %@ (ID text,Name text,Nick text,Avatar text, Role integer, updated real,reserve1 integer,reserve2 text)",TABLE_RECENT_CONTACTS]
  448. NSString* sql = [NSString stringWithFormat:@"UPDATE %@ set Name = ? , Nick = ? , Avatar = ? , Role = ? , updated = ? , reserve1 = ? , reserve2 = ?where ID = ?",TABLE_RECENT_CONTACTS];
  449. BOOL result = [_database executeUpdate:sql,user.name,user.nick,user.avatar,@(user.userRole),@(user.lastUpdateTime),@(1),@(1),user.objID];
  450. if (result)
  451. {
  452. dispatch_async(dispatch_get_main_queue(), ^{
  453. completion(nil);
  454. });
  455. }
  456. else
  457. {
  458. dispatch_async(dispatch_get_main_queue(), ^{
  459. NSError* error = [NSError errorWithDomain:@"更新数据失败" code:0 userInfo:nil];
  460. completion(error);
  461. });
  462. }
  463. }];
  464. }
  465. - (void)insertUsers:(NSArray*)users completion:(InsertsRecentContactsCOmplection)completion
  466. {
  467. [_dataBaseQueue inDatabase:^(FMDatabase *db) {
  468. [_database beginTransaction];
  469. __block BOOL isRollBack = NO;
  470. @try {
  471. [users enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
  472. DDUserEntity* user = (DDUserEntity*)obj;
  473. NSString* sql = [NSString stringWithFormat:@"INSERT OR REPLACE INTO %@ VALUES(?,?,?,?,?,?,?,?)",TABLE_RECENT_CONTACTS];
  474. //ID,Name,Nick,Avatar,Role,updated,reserve1,reserve2
  475. BOOL result = [_database executeUpdate:sql,user.objID,user.name,user.nick,user.avatar,@(user.userRole),@(user.lastUpdateTime),@(0),@""];
  476. if (!result)
  477. {
  478. isRollBack = YES;
  479. *stop = YES;
  480. }
  481. }];
  482. }
  483. @catch (NSException *exception) {
  484. [_database rollback];
  485. }
  486. @finally {
  487. if (isRollBack)
  488. {
  489. [_database rollback];
  490. DDLog(@"insert to database failure content");
  491. NSError* error = [NSError errorWithDomain:@"插入最近联系人用户失败" code:0 userInfo:nil];
  492. completion(error);
  493. }
  494. else
  495. {
  496. [_database commit];
  497. completion(nil);
  498. }
  499. }
  500. }];
  501. }
  502. - (void)insertDepartments:(NSArray*)departments completion:(InsertsRecentContactsCOmplection)completion
  503. {
  504. [_dataBaseQueue inDatabase:^(FMDatabase *db) {
  505. [_database beginTransaction];
  506. __block BOOL isRollBack = NO;
  507. @try {
  508. [departments enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
  509. DDepartment* department = [DDepartment departmentFromDic:obj];
  510. NSString* sql = [NSString stringWithFormat:@"INSERT OR REPLACE INTO %@ VALUES(?,?,?,?,?,?,?)",TABLE_DEPARTMENTS];
  511. //ID,Name,Nick,Avatar,Role,updated,reserve1,reserve2
  512. BOOL result = [_database executeUpdate:sql,department.ID,department.parentID,department.title,department.description,department.leader,@(department.status),@(department.count)];
  513. if (!result)
  514. {
  515. isRollBack = YES;
  516. *stop = YES;
  517. }
  518. }];
  519. }
  520. @catch (NSException *exception) {
  521. [_database rollback];
  522. }
  523. @finally {
  524. if (isRollBack)
  525. {
  526. [_database rollback];
  527. DDLog(@"insert to database failure content");
  528. NSError* error = [NSError errorWithDomain:@"批量插入部门信息失败" code:0 userInfo:nil];
  529. completion(error);
  530. }
  531. else
  532. {
  533. [_database commit];
  534. completion(nil);
  535. }
  536. }
  537. }];
  538. }
  539. - (void)getDepartmentFromID:(NSString*)departmentID completion:(void(^)(DDepartment *department))completion
  540. {
  541. [_dataBaseQueue inDatabase:^(FMDatabase *db) {
  542. if ([_database tableExists:TABLE_DEPARTMENTS])
  543. {
  544. [_database setShouldCacheStatements:YES];
  545. NSString* sqlString = [NSString stringWithFormat:@"SELECT * FROM %@ where ID=?",TABLE_DEPARTMENTS];
  546. FMResultSet* result = [_database executeQuery:sqlString,departmentID];
  547. DDepartment* department = nil;
  548. while ([result next])
  549. {
  550. department = [self departmentFromResult:result];
  551. }
  552. dispatch_async(dispatch_get_main_queue(), ^{
  553. completion(department);
  554. });
  555. }
  556. }];
  557. }
  558. - (void)insertAllUser:(NSArray*)users completion:(InsertsRecentContactsCOmplection)completion
  559. {
  560. [_dataBaseQueue inDatabase:^(FMDatabase *db) {
  561. [_database beginTransaction];
  562. __block BOOL isRollBack = NO;
  563. @try {
  564. if ([self clearTable:TABLE_ALL_CONTACTS]) {
  565. [users enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
  566. DDUserEntity* user = (DDUserEntity *)obj;
  567. NSString* sql = [NSString stringWithFormat:@"REPLACE INTO %@ VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?,?)",TABLE_ALL_CONTACTS];
  568. //ID,Name,Nick,Avatar,Role,updated,reserve1,reserve2
  569. BOOL result = [_database executeUpdate:sql,user.objID,user.name,user.nick,user.avatar,user.title,user.department,user.departId,user.email,user.position,@(user.roleStatus),@(user.jobNum),user.telphone,@(user.sex),user.lastUpdateTime];
  570. if (!result)
  571. {
  572. isRollBack = YES;
  573. *stop = YES;
  574. }
  575. }];
  576. }
  577. }
  578. @catch (NSException *exception) {
  579. [_database rollback];
  580. }
  581. @finally {
  582. if (isRollBack)
  583. {
  584. [_database rollback];
  585. DDLog(@"insert to database failure content");
  586. NSError* error = [NSError errorWithDomain:@"批量插入全部用户信息失败" code:0 userInfo:nil];
  587. completion(error);
  588. }
  589. else
  590. {
  591. [_database commit];
  592. completion(nil);
  593. }
  594. }
  595. }];
  596. }
  597. - (void)getAllUsers:(LoadAllContactsComplection )completion
  598. {
  599. [_dataBaseQueue inDatabase:^(FMDatabase *db) {
  600. if ([_database tableExists:TABLE_ALL_CONTACTS])
  601. {
  602. [_database setShouldCacheStatements:YES];
  603. NSMutableArray* array = [[NSMutableArray alloc] init];
  604. NSString* sqlString = [NSString stringWithFormat:@"SELECT * FROM %@ ",TABLE_ALL_CONTACTS];
  605. FMResultSet* result = [_database executeQuery:sqlString];
  606. DDUserEntity* user = nil;
  607. while ([result next])
  608. {
  609. user = [self userFromResult:result];
  610. [array addObject:user];
  611. }
  612. dispatch_async(dispatch_get_main_queue(), ^{
  613. completion(array,nil);
  614. });
  615. }
  616. }];
  617. }
  618. - (void)getUserFromID:(NSString*)userID completion:(void(^)(DDUserEntity *user))completion
  619. {
  620. [_dataBaseQueue inDatabase:^(FMDatabase *db) {
  621. if ([_database tableExists:TABLE_ALL_CONTACTS])
  622. {
  623. [_database setShouldCacheStatements:YES];
  624. NSString* sqlString = [NSString stringWithFormat:@"SELECT * FROM %@ where ID= ?",TABLE_ALL_CONTACTS];
  625. FMResultSet* result = [_database executeQuery:sqlString,userID];
  626. DDUserEntity* user = nil;
  627. while ([result next])
  628. {
  629. user = [self userFromResult:result];
  630. }
  631. dispatch_async(dispatch_get_main_queue(), ^{
  632. completion(user);
  633. });
  634. }
  635. }];
  636. }
  637. - (void)loadGroupsCompletion:(LoadRecentContactsComplection)completion
  638. {
  639. [_dataBaseQueue inDatabase:^(FMDatabase *db) {
  640. NSMutableArray* array = [[NSMutableArray alloc] init];
  641. if ([_database tableExists:TABLE_RECENT_GROUPS])
  642. {
  643. [_database setShouldCacheStatements:YES];
  644. NSString* sqlString = [NSString stringWithFormat:@"SELECT * FROM %@",TABLE_RECENT_GROUPS];
  645. FMResultSet* result = [_database executeQuery:sqlString];
  646. while ([result next])
  647. {
  648. DDGroupEntity* group = [self groupFromResult:result];
  649. [array addObject:group];
  650. }
  651. dispatch_async(dispatch_get_main_queue(), ^{
  652. completion(array,nil);
  653. });
  654. }
  655. }];
  656. }
  657. - (void)updateRecentGroup:(DDGroupEntity *)group completion:(InsertsRecentContactsCOmplection)completion
  658. {
  659. [_dataBaseQueue inDatabase:^(FMDatabase *db) {
  660. [_database beginTransaction];
  661. __block BOOL isRollBack = NO;
  662. @try {
  663. NSString* sql = [NSString stringWithFormat:@"INSERT OR REPLACE INTO %@ VALUES(?,?,?,?,?,?,?,?,?)",TABLE_RECENT_GROUPS];
  664. //ID Avatar GroupType Name CreatID Users LastMessage
  665. NSString *users = @"";
  666. if ([group.groupUserIds count]>0) {
  667. users=[group.groupUserIds componentsJoinedByString:@"-"];
  668. }
  669. BOOL result = [_database executeUpdate:sql,group.objID,group.avatar,@(group.groupType),group.name,group.groupCreatorId,users,group.lastMsg,@(group.lastUpdateTime),@(group.isShield)];
  670. if (!result)
  671. {
  672. isRollBack = YES;
  673. }
  674. }
  675. @catch (NSException *exception) {
  676. [_database rollback];
  677. }
  678. @finally {
  679. if (isRollBack)
  680. {
  681. [_database rollback];
  682. DDLog(@"insert to database failure content");
  683. NSError* error = [NSError errorWithDomain:@"插入最近群失败" code:0 userInfo:nil];
  684. completion(error);
  685. }
  686. else
  687. {
  688. [_database commit];
  689. completion(nil);
  690. }
  691. }
  692. }];
  693. }
  694. @end