Commit 276beb8f by zhangyunjie

数据库

parent 6cf4c29f
......@@ -44,7 +44,7 @@
A966215224EA80A60024EB54 /* ZYJZYJFMDatabase.m in Sources */ = {isa = PBXBuildFile; fileRef = A9661FF024EA80A50024EB54 /* ZYJZYJFMDatabase.m */; };
A966215324EA80A60024EB54 /* ZYJZYJFMDatabaseAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = A9661FF124EA80A50024EB54 /* ZYJZYJFMDatabaseAdditions.m */; };
A966215424EA80A60024EB54 /* ZYJZYJFMResultSet.m in Sources */ = {isa = PBXBuildFile; fileRef = A9661FF424EA80A50024EB54 /* ZYJZYJFMResultSet.m */; };
A966215524EA80A60024EB54 /* OffcnZYJFMDBHandler.m in Sources */ = {isa = PBXBuildFile; fileRef = A9661FF524EA80A50024EB54 /* OffcnZYJFMDBHandler.m */; };
A966215524EA80A60024EB54 /* OffcnIMZYJFMDBHandler.m in Sources */ = {isa = PBXBuildFile; fileRef = A9661FF524EA80A50024EB54 /* OffcnIMZYJFMDBHandler.m */; };
A966215624EA80A60024EB54 /* NSObject+ZYJMJCoding.m in Sources */ = {isa = PBXBuildFile; fileRef = A9661FF824EA80A50024EB54 /* NSObject+ZYJMJCoding.m */; };
A966215724EA80A60024EB54 /* ZYJMJPropertyType.m in Sources */ = {isa = PBXBuildFile; fileRef = A9661FFB24EA80A50024EB54 /* ZYJMJPropertyType.m */; };
A966215824EA80A60024EB54 /* ZYJMJProperty.m in Sources */ = {isa = PBXBuildFile; fileRef = A9661FFC24EA80A50024EB54 /* ZYJMJProperty.m */; };
......@@ -300,14 +300,14 @@
A9661FEB24EA80A50024EB54 /* ZYJZYJFMDatabaseQueue.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ZYJZYJFMDatabaseQueue.m; sourceTree = "<group>"; };
A9661FEC24EA80A50024EB54 /* ZYJZYJFMDatabaseAdditions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ZYJZYJFMDatabaseAdditions.h; sourceTree = "<group>"; };
A9661FED24EA80A50024EB54 /* ZYJZYJFMDatabasePool.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ZYJZYJFMDatabasePool.m; sourceTree = "<group>"; };
A9661FEE24EA80A50024EB54 /* OffcnZYJFMDBHandler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OffcnZYJFMDBHandler.h; sourceTree = "<group>"; };
A9661FEE24EA80A50024EB54 /* OffcnIMZYJFMDBHandler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OffcnIMZYJFMDBHandler.h; sourceTree = "<group>"; };
A9661FEF24EA80A50024EB54 /* ZYJZYJFMResultSet.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ZYJZYJFMResultSet.h; sourceTree = "<group>"; };
A9661FF024EA80A50024EB54 /* ZYJZYJFMDatabase.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ZYJZYJFMDatabase.m; sourceTree = "<group>"; };
A9661FF124EA80A50024EB54 /* ZYJZYJFMDatabaseAdditions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ZYJZYJFMDatabaseAdditions.m; sourceTree = "<group>"; };
A9661FF224EA80A50024EB54 /* ZYJZYJFMDatabaseQueue.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ZYJZYJFMDatabaseQueue.h; sourceTree = "<group>"; };
A9661FF324EA80A50024EB54 /* ZYJZYJFMDatabasePool.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ZYJZYJFMDatabasePool.h; sourceTree = "<group>"; };
A9661FF424EA80A50024EB54 /* ZYJZYJFMResultSet.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ZYJZYJFMResultSet.m; sourceTree = "<group>"; };
A9661FF524EA80A50024EB54 /* OffcnZYJFMDBHandler.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = OffcnZYJFMDBHandler.m; sourceTree = "<group>"; };
A9661FF524EA80A50024EB54 /* OffcnIMZYJFMDBHandler.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = OffcnIMZYJFMDBHandler.m; sourceTree = "<group>"; };
A9661FF824EA80A50024EB54 /* NSObject+ZYJMJCoding.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSObject+ZYJMJCoding.m"; sourceTree = "<group>"; };
A9661FF924EA80A50024EB54 /* NSObject+ZYJMJProperty.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSObject+ZYJMJProperty.h"; sourceTree = "<group>"; };
A9661FFA24EA80A50024EB54 /* ZYJMJFoundation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ZYJMJFoundation.h; sourceTree = "<group>"; };
......@@ -721,6 +721,7 @@
A9661F8124EA7AD10024EB54 /* Tools-(工具) */ = {
isa = PBXGroup;
children = (
A9D1B33324FD1308000F4662 /* ZYJQiniu */,
A9661FE824EA80A50024EB54 /* OffcnZYJFMDBHandler */,
A9661FF624EA80A50024EB54 /* ZYJLibs */,
A9661F8224EA7AD10024EB54 /* LoadingView */,
......@@ -924,8 +925,6 @@
A9661FF224EA80A50024EB54 /* ZYJZYJFMDatabaseQueue.h */,
A9661FF324EA80A50024EB54 /* ZYJZYJFMDatabasePool.h */,
A9661FF424EA80A50024EB54 /* ZYJZYJFMResultSet.m */,
A9661FEE24EA80A50024EB54 /* OffcnZYJFMDBHandler.h */,
A9661FF524EA80A50024EB54 /* OffcnZYJFMDBHandler.m */,
);
path = OffcnZYJFMDBHandler;
sourceTree = "<group>";
......@@ -1448,16 +1447,25 @@
children = (
A966274B24EBA56C0024EB54 /* OffcnIMSDKiOS.h */,
A966274C24EBA56C0024EB54 /* OffcnIMSDKiOS.m */,
A9D1B31624EFAD8C000F4662 /* OffcnUploadManager.h */,
A9D1B31724EFAD8C000F4662 /* OffcnUploadManager.m */,
A9D1B31924F34C25000F4662 /* OffcnIMSocketManager.h */,
A9D1B31A24F34C25000F4662 /* OffcnIMSocketManager.m */,
A9D1B32024F50973000F4662 /* OffcnIMModel.h */,
A9D1B32124F50973000F4662 /* OffcnIMModel.m */,
A9661FEE24EA80A50024EB54 /* OffcnIMZYJFMDBHandler.h */,
A9661FF524EA80A50024EB54 /* OffcnIMZYJFMDBHandler.m */,
);
path = "ExposedInterface-(外放接口)";
sourceTree = "<group>";
};
A9D1B33324FD1308000F4662 /* ZYJQiniu */ = {
isa = PBXGroup;
children = (
A9D1B31624EFAD8C000F4662 /* OffcnUploadManager.h */,
A9D1B31724EFAD8C000F4662 /* OffcnUploadManager.m */,
);
path = ZYJQiniu;
sourceTree = "<group>";
};
CC1958D307ED3EA5F9EA7118 /* Frameworks */ = {
isa = PBXGroup;
children = (
......@@ -1597,7 +1605,7 @@
A9661FE424EA7AD10024EB54 /* CLSlider.m in Sources */,
A966217224EA80A60024EB54 /* ZYJReachStateWWAN.m in Sources */,
A966217024EA80A60024EB54 /* ZYJReachStateUnReachable.m in Sources */,
A966215524EA80A60024EB54 /* OffcnZYJFMDBHandler.m in Sources */,
A966215524EA80A60024EB54 /* OffcnIMZYJFMDBHandler.m in Sources */,
A96621B824EA80A60024EB54 /* ZYJOSSTask.m in Sources */,
A96621DE24EA80A60024EB54 /* ZYJMQTTSessionManager.m in Sources */,
A9661FDF24EA7AD10024EB54 /* NSAttributedString+SDSize.m in Sources */,
......
......@@ -10,6 +10,7 @@
#import "ViewController.h"
#import "OffcnIMSDKiOS.h"
#import "OffcnIMSocketManager.h"
#import "OffcnIMZYJFMDBHandler.h"
@interface AppDelegate ()
......@@ -33,11 +34,13 @@
NSLog(@"changeEnvironment---%@",changeEnvironment);
[OffcnIMSDKiOS defaultService].isTest = [changeEnvironment boolValue];
//获取网络状态和内部初始化处理
[[OffcnIMSDKiOS defaultService] startNotifierUseRealReachability];
//获取用户相关数据库,该方法在登陆或者第一次启动已登陆下执行
[[OffcnIMZYJFMDBHandler sharedInstance] getUserDB];
//推送
[self registerOffcnUserNotificationSettingsWithApplication:application options:launchOptions];
//获取网络状态和内部初始化处理
[[OffcnIMSDKiOS defaultService] startNotifierUseRealReachability];
return YES;
}
......
//
//
......@@ -30,6 +30,14 @@ NS_ASSUME_NONNULL_BEGIN
@property (nonatomic,copy)NSString *msg_to;//接受消息的用户id
@property (nonatomic,assign)NSInteger msg_type;//消息类型
@property (nonatomic,strong)OffcnIMMsgModel *msg;//消息内容
//以下数据库使用
@property (nonatomic,assign)NSInteger isSentSuccess;//是否发送成功
@property (nonatomic,assign)NSInteger bymyself;//是否是我发送的
@property (nonatomic,assign)NSInteger isRead;//是否已读
@property (nonatomic,copy)NSString *lastmessage;//最后一条消息
@property (nonatomic,copy)NSString *lastSendtime;//最后一条消息时间
@property (nonatomic,copy)NSString *tid;//本地的消息Id
@end
@interface OffcnIMMsgModel : NSObject
......
//
//
......@@ -17,6 +17,7 @@
#import "NSString+MD5.h"
#import <Foundation/Foundation.h>
#import <AVFoundation/AVFoundation.h>
#import "OffcnIMZYJFMDBHandler.h"
@interface OffcnIMSDKiOS ()
......@@ -119,6 +120,23 @@ static OffcnIMSDKiOS *liveTelecastSDK;
if (!text || !text.length) {
text = @"";
}
OffcnIMMsgModel *MsgModel = [[OffcnIMMsgModel alloc] init];
OffcnIMBodyModel *BodyModel = [[OffcnIMBodyModel alloc] init];
BodyModel.msg_from = msg_fromID;
BodyModel.msg_to = msg_toID;
BodyModel.msg_type = msg_type;
BodyModel.tid = tidStr;
MsgModel.msg = text;
BodyModel.msg = MsgModel;
BodyModel.isSentSuccess = 0;
BodyModel.bymyself = 1;
BodyModel.isRead = 0;
[[OffcnIMZYJFMDBHandler sharedInstance] insertChatInfoToFMDBWithModel:BodyModel];
[[OffcnIMZYJFMDBHandler sharedInstance] chatlistCacheInfo:BodyModel callback:nil];
NSMutableDictionary *dataDic = [NSMutableDictionary dictionaryWithObject:text forKey:@"msg"];
[OffcnNetworkExecutor requestSendMsgWithMsg_fromID:msg_fromID msg_toID:msg_toID msg_type:msg_type tid:tidStr msg:dataDic Finished:^(BOOL success, OffcnIMSendMsgModel *sendMsgModel, BaseResponse *baseResponse) {
......@@ -128,6 +146,18 @@ static OffcnIMSDKiOS *liveTelecastSDK;
if (!filePath || !filePath.length) {
filePath = @"";
}
OffcnIMBodyModel *BodyModel = [[OffcnIMBodyModel alloc] init];
BodyModel.msg_from = msg_fromID;
BodyModel.msg_to = msg_toID;
BodyModel.msg_type = msg_type;
BodyModel.tid = tidStr;
BodyModel.isSentSuccess = 0;
BodyModel.bymyself = 1;
BodyModel.isRead = 0;
[[OffcnIMZYJFMDBHandler sharedInstance] insertChatInfoToFMDBWithModel:BodyModel];
[[OffcnIMZYJFMDBHandler sharedInstance] chatlistCacheInfo:BodyModel callback:nil];
[[OffcnUploadManager defaultService] uploadToQNFilePath:filePath Finished:^(BOOL success, id _Nonnull response, NSString * _Nonnull errorMessage) {
if (success) {
NSString *urlStr = @"";
......
//
//
......@@ -11,6 +11,7 @@
#import "ZYJMJExtension.h"
#import "DataSafe.h"
#import "SDGeneralTool.h"
#import "OffcnIMZYJFMDBHandler.h"
@interface OffcnIMSocketManager ()<OIMCoreDelegate>
......@@ -52,8 +53,8 @@ static OffcnIMSocketManager *socketManager;
// tls = ["disable", "enable"]
NSMutableDictionary *dic = [NSMutableDictionary dictionary];
[dic setObjectOnSafe:@"192.168.43.141" forKey:@"server_ip"];
[dic setObjectOnSafe:[NSNumber numberWithInteger:1026] forKey:@"server_port"];
[dic setObjectOnSafe:@"39.102.42.185" forKey:@"server_ip"];
[dic setObjectOnSafe:[NSNumber numberWithInteger:1280] forKey:@"server_port"];
[dic setObjectOnSafe:account_id forKey:@"account_id"];
[dic setObjectOnSafe:@"offcn_live" forKey:@"app_id"];
[dic setObjectOnSafe:@"ios" forKey:@"device_type"];
......@@ -97,6 +98,13 @@ static OffcnIMSocketManager *socketManager;
[self.msgArr addObject:msg_id];
//存数据库
OffcnIMBodyModel *body = IMModel.body;
body.isSentSuccess = 1;
body.bymyself = 0;
body.isRead = 0;
[[OffcnIMZYJFMDBHandler sharedInstance] insertChatInfoToFMDBWithModel:body];
[[OffcnIMZYJFMDBHandler sharedInstance] chatlistCacheInfo:body callback:nil];
if (self.connectReceiveMessage) {
self.connectReceiveMessage(IMModel);
}
......@@ -104,8 +112,14 @@ static OffcnIMSocketManager *socketManager;
}else{
[self.msgArr addObject:msg_id];
//存数据库
OffcnIMBodyModel *body = IMModel.body;
body.isSentSuccess = 1;
body.bymyself = 0;
body.isRead = 0;
[[OffcnIMZYJFMDBHandler sharedInstance] insertChatInfoToFMDBWithModel:body];
[[OffcnIMZYJFMDBHandler sharedInstance] chatlistCacheInfo:body callback:nil];
if (self.connectReceiveMessage) {
self.connectReceiveMessage(IMModel);
}
......
//
//
// OffcnIMZYJFMDBHandler.h
// OffcnIMSDKiOS
//
// Created by vockey on 2019/4/9.
// Copyright © 2019年 中公教育. All rights reserved.
//
#import <Foundation/Foundation.h>
typedef NS_ENUM(NSInteger, UIClearStyle) {
UIClearStyleAll = 1,//删除list和具体聊天内容
UIClearStylePart = 2,//只删除聊天内容 , list记录不删除
UIClearStyleList = 3 //删除系统消息等
};
typedef void (^getFMDBHistoryMessagesBlock)(NSArray *messagesArray);
typedef void (^callBackIsSuccess)(BOOL isSuccess);
@class OffcnIMBodyModel;
@interface OffcnIMZYJFMDBHandler : NSObject
+ (OffcnIMZYJFMDBHandler *)sharedInstance;
//获取用户相关数据库,该方法在登陆或者第一次启动已登陆下执行
- (void)getUserDB;
//发送,收到消息写入
- (void)insertChatInfoToFMDBWithModel:(OffcnIMBodyModel *)chatModel;
//消息发送成功更新状态
- (void)updateChatInfoIsSendStatusToFMDBWithModel:(OffcnIMBodyModel *)messageModel isSuccess:(callBackIsSuccess)isSuccess;
//自己发送消息更新聊天列表
- (void)chatlistCacheInfo:(OffcnIMBodyModel *)chatlistModel callback:(callBackIsSuccess)isSucess;
//某一条消息更新已读状态
- (void)updateChatInfoIsRead:(OffcnIMBodyModel *)model callBack:(callBackIsSuccess)isSuccess;
//删除个人聊天记录
- (void)deleteUserChatDataWithFromUser:(NSString *)fromUser toUser:(NSString *)toUser clearStyle:(UIClearStyle)clearStyle callBack:(callBackIsSuccess)callbackBool;
//删除消息,并更新消息列表最后一条消息
- (void)deleteMessage:(OffcnIMBodyModel *)messageModel dataSource:(NSMutableArray *)array callback:(callBackIsSuccess)isSuccess;
//删除表格
- (void)deleteDataTable;
//查询聊天记录(按时间戳倒叙排序)
- (void)getChatInfoArrayWithFromUser:(NSString *)fromUser toUser:(NSString *)toUser limit:(NSString *)limit startIndex:(NSString *)startIndex callback:(getFMDBHistoryMessagesBlock)messagesBack;
//查询聊天列表
- (void)getChatInfoAllDataArrayCallback:(getFMDBHistoryMessagesBlock)messagesBack;
//消息内容
- (NSString *)lastMessage:(OffcnIMBodyModel *)messageModel;
@end
//
//
// OffcnIMZYJFMDBHandler.m
// OffcnIMSDKiOS
//
// Created by vockey on 2019/4/9.
// Copyright © 2019年 中公教育. All rights reserved.
//
#import "OffcnIMZYJFMDBHandler.h"
#import "ZYJZYJFMDB.h"
#import "OffcnIMModel.h"
@interface OffcnIMZYJFMDBHandler()
@property (nonatomic,strong) ZYJZYJFMDatabaseQueue *database;
@end
@implementation OffcnIMZYJFMDBHandler
static OffcnIMZYJFMDBHandler *FMDBHandler;
+ (OffcnIMZYJFMDBHandler *)sharedInstance{
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
FMDBHandler = [[self alloc] init];
});
return FMDBHandler;
}
- (instancetype)init{
if (self = [super init]) {
}
return self;
}
//登陆创建表格
- (void)getUserDB{
_database = getFMDBInstance();
[self createTable];
}
- (void)createTable{
if (!_database) {
_database = getFMDBInstance();
}
NSString *creatChatListSqlStr = @"create table chatlist(msg_fromId varchar(100), msg_toId varchar(100),msg_type varchar(10),lastmessage varchar (500),lastSendtime varchar (50),primary key(msg_fromId))";
NSString *creatChatInfoSqlStr = @"create table chatinfo(ID integer PRIMARY KEY AUTOINCREMENT,msg_fromId varchar(100),msg_toId varchar(100),session_id varchar(100),msg_id varchar (100),version varchar(10),send_time varchar(50),msg_seq varchar(100),msg_scope varchar (10),msg_type varchar(10),msg varchar(500),dur varchar(30),name varchat(500),md5 varchar(500),url varchar (500),thumb_url varchar(500),cover_url varchar(500),ext varchar(30),w varchar (10),h varchar(10),size varchar(10),isSentSuccess integer,bymyself integer,isRead integer,tid varchar(100))";
[_database inDatabase:^(ZYJZYJFMDatabase *db) {
if (![db tableExists:@"chatlist"] && ![db tableExists:@"chatinfo"]) {
BOOL resCreatChatListSqlStr = [db executeUpdate:creatChatListSqlStr];
BOOL resCreatChatInfoSqlStr = [db executeUpdate:creatChatInfoSqlStr];
if (!resCreatChatListSqlStr || !resCreatChatInfoSqlStr) {
NSLog(@"error when creating database table");
NSLog(@"%d",db.lastErrorCode);
NSLog(@"%@",db.lastErrorMessage);
}
}
}];
}
//发送,收到消息写入
- (void)insertChatInfoToFMDBWithModel:(OffcnIMBodyModel *)chatModel{
if (!_database) {
getFMDBInstance();
}
[_database inDatabase:^(ZYJZYJFMDatabase *db) {
NSString *sqlStr = @"insert into chatinfo(msg_fromId,msg_toId,session_id,msg_id,version,send_time,msg_seq,msg_scope,msg_type,msg,dur,name,md5,url,thumb_url,cover_url,ext,w,h,size,isSentSuccess,bymyself,isRead,tid) values (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)";
BOOL result = [db executeUpdate:sqlStr,chatModel.msg_from,chatModel.msg_to,chatModel.session_id,chatModel.msg_id,chatModel.version,chatModel.send_time,[NSNumber numberWithInteger:chatModel.msg_seq],[NSNumber numberWithInteger:chatModel.msg_scope],[NSNumber numberWithInteger:chatModel.msg_type],chatModel.msg.msg,chatModel.msg.dur,chatModel.msg.name,chatModel.msg.md5,chatModel.msg.url,chatModel.msg.thumb_url,chatModel.msg.cover_url,chatModel.msg.ext,chatModel.msg.w,chatModel.msg.h,chatModel.msg.size,[NSNumber numberWithInteger:chatModel.isSentSuccess],[NSNumber numberWithInteger:chatModel.bymyself],[NSNumber numberWithInteger:chatModel.isRead],chatModel.tid];
if (!result) {
NSLog(@"error when insert into database table");
NSLog(@"%d",db.lastErrorCode);
NSLog(@"%@",db.lastErrorMessage);
}
}];
}
//消息发送成功更新状态
- (void)updateChatInfoIsSendStatusToFMDBWithModel:(OffcnIMBodyModel *)messageModel isSuccess:(callBackIsSuccess)isSuccess{
if (!_database) {
getFMDBInstance();
}
[_database inDatabase:^(ZYJZYJFMDatabase *db) {
NSString *sql = @"update chatinfo set isSentSuccess = ?,msg_id = ?,send_time = ?,session_id = ? where tid = ?";
BOOL result = [db executeUpdate:sql,[NSNumber numberWithInteger:messageModel.isSentSuccess],messageModel.msg_id,messageModel.send_time,messageModel.session_id,messageModel.tid];
if (!result) {
NSLog(@"error when insert into database table");
NSLog(@"%d",db.lastErrorCode);
NSLog(@"%@",db.lastErrorMessage);
}
if (isSuccess) {
isSuccess(result);
}
}];
}
//发送,接受消息更新聊天列表
- (void)chatlistCacheInfo:(OffcnIMBodyModel *)chatlistModel callback:(callBackIsSuccess)isSucess{
if (!_database) {
getFMDBInstance();
}
[_database inDatabase:^(ZYJZYJFMDatabase *db) {
//查询是否存在
NSString * sql = @"SELECT * FROM chatlist where msg_fromId = ? and msg_toId = ?";
NSMutableArray *tmpDataArray = [NSMutableArray array];
ZYJZYJFMResultSet *rs = [db executeQuery:sql,chatlistModel.msg_from,chatlistModel.msg_to];
while ([rs next]) {
OffcnIMBodyModel *tmpModel = [[OffcnIMBodyModel alloc] init];
[tmpDataArray addObject:tmpModel];
break;
}
//存在
BOOL result = NO;
if (tmpDataArray.count) {
NSString *sqlStr = @"update chatlist set lastmessage = ?,lastSendtime = ?,msg_type = ? where msg_fromId = ? and msg_toId = ?";
NSString *lastmessage = [self lastMessage:chatlistModel];
result = [db executeUpdate:sqlStr,lastmessage,chatlistModel.send_time,[NSNumber numberWithInteger:chatlistModel.msg_type],chatlistModel.msg_from,chatlistModel.msg_to];
//不存在,插库
}else{
NSString *sqlStr = @"insert into chatlist(msg_fromId,msg_toId,msg_type,lastmessage,lastSendtime)values(?,?,?,?,?)";
NSString *lastmessage = [self lastMessage:chatlistModel];
result = [db executeUpdate:sqlStr,chatlistModel.msg_from,chatlistModel.msg_to,[NSNumber numberWithInteger:chatlistModel.msg_type],lastmessage,chatlistModel.send_time];
}
if (isSucess) {
isSucess(result);
}
}];
}
//某一条消息更新已读状态
- (void)updateChatInfoIsRead:(OffcnIMBodyModel *)model callBack:(callBackIsSuccess)isSuccess{
if (!_database) {
getFMDBInstance();
}
[_database inDatabase:^(ZYJZYJFMDatabase *db) {
//插入记录到表中
NSString *sqlStr = @"update chatinfo set isRead = ? where msg_id = ?";
BOOL result = [db executeUpdate:sqlStr,[NSNumber numberWithInteger:model.isRead],model.msg_id];
if (!result) {
NSLog(@"error when insert into database table");
NSLog(@"%d",db.lastErrorCode);
NSLog(@"%@",db.lastErrorMessage);
}
if (isSuccess) {
isSuccess(result);
}
}];
}
//删除个人聊天记录
- (void)deleteUserChatDataWithFromUser:(NSString *)fromUser toUser:(NSString *)toUser clearStyle:(UIClearStyle)clearStyle callBack:(callBackIsSuccess)callbackBool{
if (!_database) {
getFMDBInstance();
}
NSString *updateStr = @"update chatlist set lastmessage = ?,lastSendtime = ?,msg_type = ? where msg_fromId = ? and msg_toId = ?";
NSString * listSql = [NSString stringWithFormat:@"delete FROM chatlist where msg_fromId = ? and msg_toId = ?"];
NSString * infoSql = [NSString stringWithFormat:@"delete FROM chatinfo where (msg_fromId =? and msg_toId = ?) or (msg_fromId =? and msg_toId = ?)"];
[_database inDatabase:^(ZYJZYJFMDatabase *db) {
[db beginTransaction];
BOOL isRollBack = YES;
@try {
switch (clearStyle) {
case UIClearStyleAll: {
[db executeUpdate:listSql,fromUser,toUser];
[db executeUpdate:infoSql,fromUser,toUser,toUser,fromUser];
}
break;
case UIClearStyleList: {
[db executeUpdate:listSql,fromUser,toUser];
}
break;
case UIClearStylePart: {
[db executeUpdate:updateStr,@"",@"",@"",fromUser,toUser];
[db executeUpdate:infoSql,fromUser,toUser,toUser,fromUser];
}
break;
default:
break;
}
}
@catch (NSException *exception) {
isRollBack = NO;
[db rollback];
}
@finally {
if (isRollBack) {
[db commit];
}
}
callbackBool(isRollBack);
}];
}
//删除消息,并更新消息列表最后一条消息
- (void)deleteMessage:(OffcnIMBodyModel *)messageModel dataSource:(NSMutableArray *)array callback:(callBackIsSuccess)isSuccess{
if (!_database) {
getFMDBInstance();
}
[_database inDatabase:^(ZYJZYJFMDatabase *db) {
//删除
NSString * sql = @"delete from chatinfo where msg_id = ? and msg_fromId = ?";
BOOL isSucceed = [db executeUpdate:sql,messageModel.msg_id,messageModel.msg_from];
NSLog(@"");
if (isSucceed) {
// NSPredicate *predicate = [NSPredicate predicateWithFormat:@"sendTime = %@ ",messageModel.sendTime];
// NSArray * refreshModel = [array filteredArrayUsingPredicate:predicate];
// JYChatMessageModel *model = refreshModel.firstObject;
[array removeObject:messageModel];
if (!array.count) {
NSString *sqlStr = @"update chatlist set lastmessage = ?,lastSendtime = ?,msg_type = ? where msg_fromId =? and msg_toId = ?";
BOOL updateSucceed = [db executeUpdate:sqlStr,@"",@"",@"",messageModel.msg_from,messageModel.msg_to];
if (isSuccess) {
isSuccess(updateSucceed);
}
}else{
//更新chatlist
for (NSInteger index = array.count - 1; index > 0; index --) {
OffcnIMBodyModel *lastModel = array[index];
if (lastModel.isSentSuccess) {
NSString *sqlStr = @"update chatlist set lastmessage = ?,lastSendtime = ?,msg_type = ? where msg_fromId =? and msg_toId = ?";
NSString *lastmessage = [self lastMessage:lastModel];
BOOL updateSucceed = [db executeUpdate:sqlStr,lastmessage,lastModel.send_time,[NSNumber numberWithInteger:lastModel.msg_type],lastModel.msg_from,lastModel.msg_to];
if (isSuccess) {
isSuccess(updateSucceed);
}
break;
}
}
}
}
}];
}
//删除表格
- (void)deleteDataTable{
NSString *sqlListStr = @"DROP TABLE chatlist";
NSString *sqlInfostr = @"DROP TABLE chatinfo";
[_database inDatabase:^(ZYJZYJFMDatabase *db) {
BOOL resCreatChatListSqlStr = [db executeUpdate:sqlListStr];
BOOL resCreatChatInfoSqlStr = [db executeUpdate:sqlInfostr];
if (!resCreatChatListSqlStr || !resCreatChatInfoSqlStr) {
NSLog(@"error when drop database table");
NSLog(@"%d",db.lastErrorCode);
NSLog(@"%@",db.lastErrorMessage);
}
}];
}
//查询聊天记录(按时间戳倒叙排序)
- (void)getChatInfoArrayWithFromUser:(NSString *)fromUser toUser:(NSString *)toUser limit:(NSString *)limit startIndex:(NSString *)startIndex callback:(getFMDBHistoryMessagesBlock)messagesBack{
if (!_database) {
getFMDBInstance();
}
NSString * sql = [NSString stringWithFormat:@"SELECT * FROM chatinfo where (msg_fromId =? and msg_toId = ?) or (msg_fromId =? and msg_toId = ?) order by send_time desc limit ?,?"];
[_database inDatabase:^(ZYJZYJFMDatabase *db) {
ZYJZYJFMResultSet *rs = [db executeQuery:sql,fromUser,toUser,toUser,fromUser,startIndex,limit];
NSMutableArray *tmpArray = [NSMutableArray array];
while ([rs next]) {
OffcnIMBodyModel *tmpModel = [[OffcnIMBodyModel alloc]init];
OffcnIMMsgModel *tmpContentModel = [[OffcnIMMsgModel alloc]init];
tmpModel.msg_from = [rs stringForColumn:@"msg_fromId"];
tmpModel.msg_to = [rs stringForColumn:@"msg_toId"];
tmpModel.session_id = [rs stringForColumn:@"session_id"];
tmpModel.msg_id = [rs stringForColumn:@"msg_id"];
tmpModel.version = [rs stringForColumn:@"version"];
tmpModel.send_time = [rs stringForColumn:@"send_time"];
tmpModel.msg_seq = [rs longLongIntForColumn:@"msg_seq"];
tmpModel.msg_scope = [rs intForColumn:@"msg_scope"];
tmpModel.msg_type = [rs intForColumn:@"msg_type"];
tmpModel.isSentSuccess = [rs intForColumn:@"isSentSuccess"];
tmpModel.bymyself = [rs intForColumn:@"bymyself"];
tmpModel.isRead = [rs intForColumn:@"isRead"];
tmpContentModel.msg = [rs stringForColumn:@"msg"];
tmpContentModel.dur = [[rs stringForColumn:@"dur"] integerValue];
tmpContentModel.name = [rs stringForColumn:@"name"];
tmpContentModel.md5 = [rs stringForColumn:@"md5"];
tmpContentModel.url = [rs stringForColumn:@"url"];
tmpContentModel.thumb_url = [rs stringForColumn:@"thumb_url"];
tmpContentModel.cover_url = [rs stringForColumn:@"cover_url"];
tmpContentModel.ext = [rs stringForColumn:@"ext"];
tmpContentModel.w = [[rs stringForColumn:@"w"] integerValue];
tmpContentModel.h = [[rs stringForColumn:@"h"] integerValue];
tmpContentModel.size = [[rs stringForColumn:@"size"] integerValue];
tmpModel.msg = tmpContentModel;
[tmpArray addObject:tmpModel];
}
//回调历史消息记录
if (messagesBack) {
// NSArray* reversedArray = [[tmpArray reverseObjectEnumerator] allObjects];
messagesBack(tmpArray);
}
}];
}
//查询聊天列表
- (void)getChatInfoAllDataArrayCallback:(getFMDBHistoryMessagesBlock)messagesBack{
if (!_database) {
getFMDBInstance();
}
NSString * sql = [NSString stringWithFormat:@"SELECT * FROM chatlist order by lastSendtime asc"];
[_database inDatabase:^(ZYJZYJFMDatabase *db) {
ZYJZYJFMResultSet *rs = [db executeQuery:sql];
NSMutableArray *tmpArray = [NSMutableArray array];
while ([rs next]) {
OffcnIMBodyModel *tmpModel = [[OffcnIMBodyModel alloc]init];
tmpModel.msg_from = [rs stringForColumn:@"msg_fromId"];
tmpModel.msg_to = [rs stringForColumn:@"msg_toId"];
tmpModel.msg_type = [rs intForColumn:@"msg_type"];
tmpModel.lastmessage = [rs stringForColumn:@"lastmessage"];
tmpModel.lastSendtime = [rs stringForColumn:@"lastSendtime"];
[tmpArray addObject:tmpModel];
}
//回调历史消息记录
if (messagesBack) {
messagesBack(tmpArray);
}
}];
}
//消息内容
- (NSString *)lastMessage:(OffcnIMBodyModel *)messageModel{
NSString *lastMessage = nil;
if (messageModel.msg_type == 1) {
//文本消息
lastMessage = messageModel.msg.msg;
return lastMessage;
}else if (messageModel.msg_type == 2){
//图片消息
lastMessage = messageModel.msg.url;
return lastMessage;
}else if (messageModel.msg_type == 3){
//音频消息
lastMessage = messageModel.msg.url;
return lastMessage;
}else if (messageModel.msg_type == 4){
//视频消息
lastMessage = messageModel.msg.url;
return lastMessage;
}else if (messageModel.msg_type == 5){
//文件消息
lastMessage = messageModel.msg.url;
return lastMessage;
}
return @"";
}
#pragma mark - 聊天本地数据库
//创建聊天本地数据库
NS_INLINE ZYJZYJFMDatabaseQueue * getFMDBInstance(){
NSString *path = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES).firstObject;
NSString *filePath = [path stringByAppendingPathComponent:@"ZYJFMDBIMChat.db"];
ZYJZYJFMDatabaseQueue *database = [ZYJZYJFMDatabaseQueue databaseQueueWithPath:filePath];
return database;
}
@end
//
//
......@@ -10,6 +10,7 @@
#import "DataSafe.h"
#import "SDConfigrationNetwork.h"
#import "ZYJMJExtension.h"
#import "OffcnIMZYJFMDBHandler.h"
@implementation OffcnNetworkExecutor
+ (void)cancelAllOperations{
......@@ -49,9 +50,27 @@
if (baseResponse.isSuccess) {
OffcnIMSendMsgModel *SendMsgModel = [OffcnIMSendMsgModel mj_ZYJobjectWithKeyValues:baseResponse.responseObject];
OffcnIMBodyModel *BodyModel = [[OffcnIMBodyModel alloc] init];
BodyModel.msg_id = SendMsgModel.msg_id;
BodyModel.send_time = SendMsgModel.send_time;
BodyModel.session_id = SendMsgModel.session_id;
BodyModel.tid = tid;
BodyModel.isSentSuccess = 1;
[[OffcnIMZYJFMDBHandler sharedInstance] updateChatInfoIsSendStatusToFMDBWithModel:BodyModel isSuccess:nil];
finished(YES,SendMsgModel,nil);
}else{
OffcnIMBodyModel *BodyModel = [[OffcnIMBodyModel alloc] init];
BodyModel.msg_id = @"";
BodyModel.send_time = @"";
BodyModel.session_id = @"";
BodyModel.tid = tid;
BodyModel.isSentSuccess = 0;
[[OffcnIMZYJFMDBHandler sharedInstance] updateChatInfoIsSendStatusToFMDBWithModel:BodyModel isSuccess:nil];
finished(NO,nil,baseResponse);
}
}];
......
//
++ /dev/null
//
// OffcnZYJFMDBHandler.h
// OffcnIMSDKiOS
//
// Created by vockey on 2019/4/9.
// Copyright © 2019年 中公教育. All rights reserved.
//
#import <Foundation/Foundation.h>
#import "ZYJZYJFMDB.h"
typedef NS_ENUM(NSInteger, UIClearStyle) {
UIClearStyleAll = 2,//删除list和具体聊天内容
UIClearStylePart = 3,//只删除聊天内容 , list记录不删除
UIClearStyleList = 4 //删除系统消息等
};
typedef void(^ReturnData)(NSMutableArray *modelArr);
@interface OffcnZYJFMDBHandler : NSObject
+ (OffcnZYJFMDBHandler *)sharedInstance;
@end
//
++ /dev/null
//
// OffcnZYJFMDBHandler.m
// OffcnIMSDKiOS
//
// Created by vockey on 2019/4/9.
// Copyright © 2019年 中公教育. All rights reserved.
//
#import "OffcnZYJFMDBHandler.h"
@interface OffcnZYJFMDBHandler()
@property (nonatomic,strong) ZYJZYJFMDatabaseQueue *chatDBDatabase;
@end
@implementation OffcnZYJFMDBHandler
static OffcnZYJFMDBHandler *FMDBHandler;
+ (OffcnZYJFMDBHandler *)sharedInstance {
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
FMDBHandler = [[self alloc] init];
});
return FMDBHandler;
}
- (instancetype)init {
if (self = [super init]) {
}
return self;
}
#pragma mark - 聊天本地数据库
//创建聊天本地数据库
NS_INLINE ZYJZYJFMDatabaseQueue * getFMDBInstance(){
NSString *path = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES).firstObject;
NSString *filePath = [path stringByAppendingPathComponent:@"ZYJFMDBChat.db"];
ZYJZYJFMDatabaseQueue *database = [ZYJZYJFMDatabaseQueue databaseQueueWithPath:filePath];
return database;
}
@end
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment