FMDB存储聊天记录 (plist存储最后一组对话数据)
聊天记录存在的参数 根据mvc先创建model
#import <Foundation/Foundation.h> @interface ChatSQLModel : NSObject @property (nonatomic,copy)NSString *fromUserName; @property (nonatomic,copy)NSString *fromUserId; @property (nonatomic,copy)NSString *chatContent; @property (nonatomic,copy)NSString *chatImage; @property (nonatomic,copy)NSString *audioStr; @property (nonatomic,copy)NSString *chatContentType; @property (nonatomic,copy)NSString *toUserId; @property (nonatomic,copy)NSString *toUserName; @property (nonatomic,copy)NSString *chatFrom; @property (nonatomic,copy)NSString *audiofileName; //***创建时间 @property (nonatomic,copy)NSString *createTime; @end
存储聊天记录 每组对话存到一个表中 最后的对话 存放在plist中 (类似QQ)
#import <Foundation/Foundation.h> #import "ChatSQLModel.h" @interface ChatDBManager : NSObject +(ChatDBManager *)defaultChatManager; //创建一聊天记录表 -(void)createNewTableWithModel:(ChatSQLModel *)model; //插入聊天记录 -(void)insertChatModelWithModel:(ChatSQLModel *)model; //得到聊天记录的相关内容 -(NSMutableArray *)getChatHistoryWithModel:(ChatSQLModel *)model; //清空聊天记录 -(void)clearChatTableWithModel:(ChatSQLModel*)model; @end
写个单例 每次创建表时先判断表是否存在
// 判断是否存在表 - (BOOL) isTableOK:(NSString *)tableName { FMResultSet *rs = [_chatDataBase executeQuery:@"SELECT count(*) as 'count' FROM sqlite_master WHERE type ='table' and name = ?", tableName]; while ([rs next]) { NSInteger count = [rs intForColumn:@"count"]; if (0 == count) { return NO; } else { return YES; } } return NO; }
创建表
//根据model创建聊天记录的表 -(id)init{ self = [super init]; if(self){ NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSString *documentDirectory = [paths objectAtIndex:0]; NSString *dbPath = [documentDirectory stringByAppendingPathComponent:@"ChatDataBase.db"]; _chatDataBase = [[FMDatabase alloc] initWithPath:dbPath]; [_chatDataBase open]; } return self; } //创建聊天记录表 -(void)createNewTableWithModel:(ChatSQLModel *)model{ if([_chatDataBase open]){ if ([self isTableOK:model.toUserId]==YES) { NSLog(@"已经存在这张表"); return; } NSString *createChatTable = [NSString stringWithFormat:@"create table if not exists '%@' (fromUserName varchar(256),fromUserId varchar(256),chatContent varchar(256),toUserId varchar(256),toUserName varchar(256),chatImage varchar(256),audio varchar(256),chatType varchar(256),chatFrom varchar(256))",model.toUserId]; BOOL ifSuccess = [_chatDataBase executeUpdate:createChatTable]; if(ifSuccess){ NSLog(@"创建%@与%@的聊天记录表成功!",model.fromUserName,model.toUserName); }else{ NSLog(@"创建%@与%@的聊天记录表失败!",model.fromUserName,model.toUserName); } } }
插入聊天记录
//添加一条数据 -(void)insertChatModelWithModel:(ChatSQLModel *)model{ NSString *insertCharSQL = [NSString stringWithFormat:@"insert into '%@'(fromUserName,fromUserId,chatContent,toUserId,toUserName,chatImage,audio,chatType,chatFrom) values(?,?,?,?,?,?,?,?,?)",model.toUserId]; BOOL ifSuccessed = [_chatDataBase executeUpdate:insertCharSQL,model.fromUserName,model.fromUserId,model.chatContent,model.toUserId,model.toUserName,model.chatImage,model.audioStr,model.chatContentType,model.chatFrom]; if(ifSuccessed){ NSLog(@"插入与%@聊天数据成功",model.fromUserName); }else{ NSLog(@"插入与%@聊天数据失败",model.fromUserName); } }
获取表的数据
//获取表的数据 -(NSMutableArray *)getChatHistoryWithModel:(ChatSQLModel *)model{ NSString *selectSQL = [NSString stringWithFormat:@"select * from '%@'",model.toUserId]; FMResultSet *set = [_chatDataBase executeQuery:selectSQL]; NSMutableArray *array = [NSMutableArray array]; while ([set next]) { ChatSQLModel *model = [[ChatSQLModel alloc] init]; model.fromUserId = [set stringForColumn:@"fromUserId"]; model.fromUserName = [set stringForColumn:@"fromUserName"]; model.chatContent = [set stringForColumn:@"chatContent"]; model.toUserId = [set stringForColumn:@"toUserId"]; model.toUserName = [set stringForColumn:@"toUserName"]; model.chatImage = [set stringForColumn:@"chatImage"]; model.audioStr = [set stringForColumn:@"audio"]; model.chatContentType = [set stringForColumn:@"chatType"]; model.chatFrom = [set stringForColumn:@"chatFrom"]; [array addObject:model]; } return array; }
清除聊天记录
//清楚聊天记录 -(void)clearChatTableWithModel:(ChatSQLModel *)model{ BOOL ifSuccessed = [_chatDataBase executeUpdate:[NSString stringWithFormat:@"delete from '%@'",model.toUserId]]; if(ifSuccessed){ NSLog(@"删除与%@聊天数据成功",model.fromUserName); }else{ NSLog(@"删除与%@聊天数据失败",model.fromUserName); } }
至于最后一条记录的存储 就是纯plist的操作
#import <Foundation/Foundation.h> @interface LastChatList : NSObject +(LastChatList *)shareLastChat; //创建聊天的plist文件 -(void)createChatPList; //存入聊天记录的最后一条记录 -(void)insertPlistWithL:(NSMutableDictionary *)lastChatDict; //读取聊天记录的最后一条数据 -(NSMutableArray *)getAllPlistDataArr; //清空聊天记录 -(void)clearPlist; @end
#import "LastChatList.h" @implementation LastChatList { NSString *fieldPath; } static LastChatList *_lastPlist; +(LastChatList*)shareLastChat{ if(_lastPlist == nil){ _lastPlist = [[LastChatList alloc] init]; } return _lastPlist; } -(void)createChatPList{ NSArray* paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSString* fieldPathOld = [paths objectAtIndex:0]; fieldPath = [fieldPathOld stringByAppendingPathComponent:@"lastChat.plist"]; NSFileManager *file = [NSFileManager defaultManager]; if([file fileExistsAtPath:fieldPath]){ NSLog(@"文件已经存在 不要创建"); }else{ NSLog(@"文件不存在 需要创建"); NSArray *doc = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSString *docPath = [ doc objectAtIndex:0]; NSMutableArray *rootArray = [[NSMutableArray alloc]init]; [rootArray writeToFile:[docPath stringByAppendingPathComponent:@"lastChat.plist"] atomically:YES]; } NSLog(@"fieldPath = %@",fieldPath); } //存入聊天记录的最后一条记录 -(void)insertPlistWithL:(NSMutableDictionary *)lastChatDict{ int ifExist = [self checkIfExixts:lastChatDict]; NSMutableArray *arr = [self getAllPlistDataArr]; if(ifExist == -1){ //新数据 [arr addObject:lastChatDict]; }else{ [arr replaceObjectAtIndex:ifExist withObject:lastChatDict]; } [arr writeToFile:fieldPath atomically:YES]; } //读取聊天记录的最后一条数据 -(NSMutableArray *)getAllPlistDataArr{ NSMutableArray *arr = [NSMutableArray arrayWithContentsOfFile:fieldPath]; return arr; } -(int)checkIfExixts:(NSDictionary *)newDataDict{ NSMutableArray *arr = [NSMutableArray arrayWithContentsOfFile:fieldPath]; for(int i=0;i<arr.count;i++){ NSDictionary *dict = arr[i]; NSString *toUserId = [dict objectForKey:@"toUserID"]; NSString *fromUserId = [dict objectForKey:@"fromUserID"]; NSString *newToUserId = [newDataDict objectForKey:@"toUserID"]; NSString *newFromUserId =[newDataDict objectForKey:@"fromUserID"]; if([toUserId isEqualToString:newToUserId]&&[fromUserId isEqualToString:newFromUserId]){ NSLog(@"存在"); return i; } } return -1; } -(void)clearPlist{ NSMutableArray *arr = [self getAllPlistDataArr]; [arr removeAllObjects]; [arr writeToFile:fieldPath atomically:YES]; }