Files
2026-07-13 12:35:01 +08:00

189 lines
6.2 KiB
Objective-C

//
// TLDBGroupStore.m
// TLChat
//
// Created by 李伯坤 on 16/4/17.
// Copyright © 2016年 李伯坤. All rights reserved.
//
#import "TLDBGroupStore.h"
#import "TLDBGroupSQL.h"
#import "TLGroup.h"
@implementation TLDBGroupStore
- (id)init
{
if (self = [super init]) {
self.dbQueue = [TLDBManager sharedInstance].commonQueue;
BOOL ok = [self createTable];
if (!ok) {
DDLogError(@"DB: 讨论组表创建失败");
}
}
return self;
}
- (BOOL)createTable
{
NSString *sqlString = [NSString stringWithFormat:SQL_CREATE_GROUPS_TABLE, GROUPS_TABLE_NAME];
BOOL ok = [self createTable:GROUPS_TABLE_NAME withSQL:sqlString];
if (ok) {
sqlString = [NSString stringWithFormat:SQL_CREATE_GROUP_MEMBERS_TABLE, GROUP_MEMBER_TABLE_NAMGE];
ok = [self createTable:GROUP_MEMBER_TABLE_NAMGE withSQL:sqlString];
}
return ok;
}
- (BOOL)addGroup:(TLGroup *)group forUid:(NSString *)uid
{
NSString *sqlString = [NSString stringWithFormat:SQL_UPDATE_GROUP, GROUPS_TABLE_NAME];
NSArray *arrPara = [NSArray arrayWithObjects:
TLNoNilString(uid),
TLNoNilString(group.groupID),
TLNoNilString(group.groupName),
@"", @"", @"", @"", @"", nil];
BOOL ok = [self excuteSQL:sqlString withArrParameter:arrPara];
if (ok) {
// 将通讯录成员插入数据库
ok = [self addGroupMembers:group.users forUid:uid andGid:group.groupID];
}
return ok;
}
- (BOOL)updateGroupsData:(NSArray *)groupData forUid:(NSString *)uid
{
NSArray *oldData = [self groupsDataByUid:uid];
if (oldData.count > 0) {
// 建立新数据的hash表,用于删除数据库中的过时数据
NSMutableDictionary *newDataHash = [[NSMutableDictionary alloc] init];
for (TLGroup *group in groupData) {
[newDataHash setValue:@"YES" forKey:group.groupID];
}
for (TLGroup *group in oldData) {
if ([newDataHash objectForKey:group.groupID] == nil) {
BOOL ok = [self deleteGroupByGid:group.groupID forUid:uid];
if (!ok) {
DDLogError(@"DBError: 删除过期讨论组失败!");
}
}
}
}
// 将数据插入数据库
for (TLGroup *group in groupData) {
BOOL ok = [self addGroup:group forUid:uid];
if (!ok) {
return ok;
}
}
return YES;
}
- (NSMutableArray *)groupsDataByUid:(NSString *)uid
{
__block NSMutableArray *data = [[NSMutableArray alloc] init];
NSString *sqlString = [NSString stringWithFormat:SQL_SELECT_GROUPS, GROUPS_TABLE_NAME, uid];
[self excuteQuerySQL:sqlString resultBlock:^(FMResultSet *retSet) {
while ([retSet next]) {
TLGroup *group = [[TLGroup alloc] init];
group.groupID = [retSet stringForColumn:@"gid"];
group.groupName = [retSet stringForColumn:@"name"];
[data addObject:group];
}
[retSet close];
}];
// 获取讨论组成员
for (TLGroup *group in data) {
group.users = [self groupMembersForUid:uid andGid:group.groupID];
}
return data;
}
- (BOOL)deleteGroupByGid:(NSString *)gid forUid:(NSString *)uid
{
NSString *sqlString = [NSString stringWithFormat:SQL_DELETE_GROUP, GROUPS_TABLE_NAME, uid, gid];
BOOL ok = [self excuteSQL:sqlString, nil];
return ok;
}
#pragma mark - # Group Members
- (BOOL)addGroupMember:(TLUser *)user forUid:(NSString *)uid andGid:(NSString *)gid
{
NSString *sqlString = [NSString stringWithFormat:SQL_UPDATE_GROUP_MEMBER, GROUP_MEMBER_TABLE_NAMGE];
NSArray *arrPara = [NSArray arrayWithObjects:
TLNoNilString(uid),
TLNoNilString(gid),
TLNoNilString(user.userID),
TLNoNilString(user.username),
TLNoNilString(user.nikeName),
TLNoNilString(user.avatarURL),
TLNoNilString(user.remarkName),
@"", @"", @"", @"", @"", nil];
BOOL ok = [self excuteSQL:sqlString withArrParameter:arrPara];
return ok;
}
- (BOOL)addGroupMembers:(NSArray *)users forUid:(NSString *)uid andGid:(NSString *)gid
{
NSArray *oldData = [self groupMembersForUid:uid andGid:gid];
if (oldData.count > 0) {
// 建立新数据的hash表,用于删除数据库中的过时数据
NSMutableDictionary *newDataHash = [[NSMutableDictionary alloc] init];
for (TLUser *user in users) {
[newDataHash setValue:@"YES" forKey:user.userID];
}
for (TLUser *user in oldData) {
if ([newDataHash objectForKey:user.userID] == nil) {
BOOL ok = [self deleteGroupMemberForUid:uid gid:gid andFid:user.userID];
if (!ok) {
DDLogError(@"DBError: 删除过期好友失败");
}
}
}
}
for (TLUser *user in users) {
BOOL ok = [self addGroupMember:user forUid:uid andGid:gid];
if (!ok) {
return NO;
}
}
return YES;
}
- (NSMutableArray *)groupMembersForUid:(NSString *)uid andGid:(NSString *)gid
{
__block NSMutableArray *data = [[NSMutableArray alloc] init];
NSString *sqlString = [NSString stringWithFormat:SQL_SELECT_GROUP_MEMBERS, GROUP_MEMBER_TABLE_NAMGE, uid];
[self excuteQuerySQL:sqlString resultBlock:^(FMResultSet *retSet) {
while ([retSet next]) {
TLUser *user = [[TLUser alloc] init];
user.userID = [retSet stringForColumn:@"uid"];
user.username = [retSet stringForColumn:@"username"];
user.nikeName = [retSet stringForColumn:@"nikename"];
user.avatarURL = [retSet stringForColumn:@"avatar"];
user.remarkName = [retSet stringForColumn:@"remark"];
[data addObject:user];
}
[retSet close];
}];
return data;
}
- (BOOL)deleteGroupMemberForUid:(NSString *)uid gid:(NSString *)gid andFid:(NSString *)fid
{
NSString *sqlString = [NSString stringWithFormat:SQL_DELETE_GROUP_MEMBER, GROUP_MEMBER_TABLE_NAMGE, uid, gid, fid];
BOOL ok = [self excuteSQL:sqlString, nil];
return ok;
}
@end