/**
* DB中IMMessage表操作类
* @author shuchen
*/
package com.mogujie.tt.db;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import android.content.Context;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import com.mogujie.tt.config.SysConstant;
import com.mogujie.tt.entity.MessageInfo;
import com.mogujie.tt.log.Logger;
/**
*
*/
public class MessageModel {
private DBHelper helper;
private Logger logger = Logger.getLogger(MessageModel.class);
/**
* @author shuchen
*/
public MessageModel(Context context) {
helper = DBHelper.getInstance(context);
// 因为getWritableDatabase内部调用了mContext.openOrCreateDatabase(mName, 0,
// mFactory);
// 所以要确保context已初始化,我们可以把实例化DBManager的步骤放在Activity的onCreate里
}
// /**
// * 获得消息唯一序列号
// */
// private int getSequNo() {
// return queryLastMsgId();
// }
/**
* 新增一条消息
*
* @param msg 消息体
* @return msgId 消息存储的唯一ID TODO 暂时用旧的实体类,不用子类强转,程序完成后DB再对应
*/
public int add(MessageInfo msg) {
// if (null == msg || null == msg.getMsgFromUserId()
// || null == msg.getTargetId()
// /* || SysConstant.DEFAULT_MESSAGE_ID == msg.getMsgId()*/) {
// return SysConstant.DEFAULT_MESSAGE_ID;
// }
// int msgId = msg.getMsgId();
// int dt = msg.getDisplayType();
// Long timeNow = Long.valueOf(System.currentTimeMillis());
//
// int created = (0 == msg.getCreated()) ? (int) (timeNow / 1000) : msg
// .getCreated();
// int updated = (0 == msg.getUpdated()) ? (int) (timeNow / 1000) : msg
// .getUpdated();
// SQLiteDatabase dbMaster = null;
// try {
// dbMaster = helper.getWritableDatabase();
// dbMaster.beginTransaction(); // 每条消息分两张表存储,只能用事务来处理了
//
// dbMaster.execSQL(
// DBHelper.INSERT_MESSAGE_SQL,
// new Object[] {
// msgId, msg.getMsgParentId(),
// msg.getOwnerId(), msg.getRelateId(),
// msg.getMsgFromUserId(), msg.getTargetId(),
// msg.getMsgType(), msg.getDisplayType(),
// msg.getMsgOverview(), msg.getMsgLoadState(),
// msg.getMsgReadStatus(), created, updated
// });
//
// if (SysConstant.DISPLAY_TYPE_TEXT == dt) {
// // 文本类消息
// dbMaster.execSQL(DBHelper.INSERT_MESSAGE_EXTRA_TEXT,
// new Object[] {
// msgId, msg.getMsgContent(), created,
// updated
// });
// } else if (SysConstant.DISPLAY_TYPE_IMAGE == dt) {
// // 图片消息
// dbMaster.execSQL(DBHelper.INSERT_MESSAGE_EXTRA_IMAGE,
// new Object[] {
// msgId, msg.getSavePath(), msg.getUrl(), created, updated
// });
// } else if (SysConstant.DISPLAY_TYPE_AUDIO == dt) {
// // 语音消息
// dbMaster.execSQL(DBHelper.INSERT_MESSAGE_EXTRA_AUDIO,
// new Object[] {
// msgId, msg.getSavePath(), msg.getUrl(),
// msg.getPlayTime(), created, updated
// });
// } else {
// // 未知消息,为扩展做准备
// msgId = SysConstant.DEFAULT_MESSAGE_ID; // 为defalutMsgId
// // -1,即未添加成功
// }
// dbMaster.setTransactionSuccessful();
// } catch (SQLException e) {
// logger.e(e.toString());
// } finally {
// if (null != dbMaster) {
// dbMaster.endTransaction();
// }
// // dbMaster.close();
// }
//
// return msgId;
return 0;
}
/**
* 更新图片存储路径
*
* @param msgId 消息ID
* @param status 消息状态
* @return Boolean
*/
public Boolean updateMsgImageSavePath(int msgId, String newPath) {
Boolean boolRtn = false;
if (SysConstant.DEFAULT_MESSAGE_ID == msgId) {
return boolRtn;
}
int updated = (int) (Long.valueOf(System.currentTimeMillis()) / 1000);
SQLiteDatabase dbMaster;
try {
dbMaster = helper.getWritableDatabase();
String updateSql = "UPDATE " + DBHelper.TABLE_EXTRA_IMAGE + " SET "
+ DBHelper.COLUMN_MESSAGE_EXTRA_IMAGE_SAVE_PATH + " = ?, "
+ DBHelper.COLUMN_UPDATED + " = ? where "
+ DBHelper.COLUMN_MESSAGE_ID + " = ?";
dbMaster.execSQL(updateSql, new Object[] {
newPath,
updated, msgId
});
// Logger.getLogger(MessageDB.class).d(
// "UPDATE " + DBHelper.TABLE_EXTRA_IMAGE + " SET "
// + DBHelper.COLUMN_MESSAGE_EXTRA_IMAGE_SAVE_PATH + " = " + newPath
// + "where "
// + DBHelper.COLUMN_MESSAGE_ID + " = " + msgId);
boolRtn = true;
} catch (SQLException e) {
logger.e(e.toString());
} finally {
// dbMaster.close();
}
return boolRtn;
}
/**
* 更新某条消息状态(加载状态)
*
* @param msgId 消息ID
* @param status 消息状态
* @return Boolean
*/
public Boolean updateStatusByMsgId(int msgId, int status) {
Boolean boolRtn = false;
if (SysConstant.DEFAULT_MESSAGE_ID == msgId) {
return boolRtn;
}
int updated = (int) (Long.valueOf(System.currentTimeMillis()) / 1000);
SQLiteDatabase dbMaster;
try {
dbMaster = helper.getWritableDatabase();
// 消息状态只在Messages主表中存在,所以单表更新即可
String updateSql = "UPDATE " + DBHelper.TABLE_MESSAGES + " SET `"
+ DBHelper.COLUMN_MESSAGE_STATUS + "` = ?, `"
+ DBHelper.COLUMN_UPDATED + "` = ? where `"
+ DBHelper.COLUMN_MESSAGE_ID + "` = ?";
dbMaster.execSQL(updateSql, new Object[] {
status, updated, msgId
});
boolRtn = true;
} catch (SQLException e) {
logger.e(e.toString());
} finally {
// dbMaster.close();
}
return boolRtn;
}
/**
* 更新某条消息状态(是否已读或展现)
*
* @param msgId 消息ID
* @param readStatus 消息是否已读或展现状态
* @return Boolean
*/
public Boolean updateReadStatusByMsgId(int msgId, int readStatus) {
Boolean boolRtn = false;
if (SysConstant.DEFAULT_MESSAGE_ID == msgId) {
return boolRtn;
}
int updated = (int) (Long.valueOf(System.currentTimeMillis()) / 1000);
SQLiteDatabase dbMaster;
try {
dbMaster = helper.getWritableDatabase();
// 消息状态只在Messages主表中存在,所以单表更新即可
String updateSql = "UPDATE " + DBHelper.TABLE_MESSAGES + " SET `"
+ DBHelper.COLUMN_MESSAGE_READ_STATUS + "` = ?, `"
+ DBHelper.COLUMN_UPDATED + "` = ? where `"
+ DBHelper.COLUMN_MESSAGE_ID + "` = ?";
dbMaster.execSQL(updateSql, new Object[] {
readStatus, updated, msgId
});
boolRtn = true;
} catch (SQLException e) {
logger.e(e.toString());
} finally {
// dbMaster.close();
}
return boolRtn;
}
/**
* 更新两个用户之间的某条消息之前(含某条消息)的所有消息状态(加载状态)
*
* @param msgId 消息ID,做分界用
* @param relateId 两个用户之间的联系ID
* @param status 消息状态
* @return Boolean
*/
public Boolean updateStatusBefore(String ownerId, int msgId, int relateId,
int status) {
Boolean boolRtn = false;
if (null == ownerId || 0 == msgId || 0 == relateId) {
return boolRtn;
}
int updated = (int) (Long.valueOf(System.currentTimeMillis()) / 1000);
SQLiteDatabase dbMaster;
try {
dbMaster = helper.getWritableDatabase();
// 消息状态只在Messages主表中存在,所以单表更新即可
String updateSql = "UPDATE "
+ DBHelper.TABLE_MESSAGES + " SET `"
+ DBHelper.COLUMN_MESSAGE_STATUS + "` = ?, `"
+ DBHelper.COLUMN_UPDATED + "` = ? where `"
+ DBHelper.COLUMN_OWNER_ID + "` = ? and `"
+ DBHelper.COLUMN_RELATE_ID + "` = ? and "
+ DBHelper.COLUMN_MESSAGE_ID + " <= ?";
dbMaster.execSQL(updateSql, new Object[] {
status, updated,
ownerId, relateId, msgId
});
boolRtn = true;
} catch (SQLException e) {
logger.e(e.toString());
} finally {
// dbMaster.close();
}
return boolRtn;
}
/**
* 更新两个用户之间的某条消息之前(含某条消息)的所有消息状态(是否已读或展现)
*
* @param msgId 消息ID,做分界用
* @param relateId 两个用户之间的联系ID
* @param status 消息状态
* @return Boolean
*/
public Boolean updateReadStatusBefore(String ownerId, int msgId, int relateId,
int readStatus) {
Boolean boolRtn = false;
if (null == ownerId || SysConstant.DEFAULT_MESSAGE_ID == msgId || 0 == relateId) {
return boolRtn;
}
int updated = (int) (Long.valueOf(System.currentTimeMillis()) / 1000);
SQLiteDatabase dbMaster;
try {
dbMaster = helper.getWritableDatabase();
// 消息状态只在Messages主表中存在,所以单表更新即可
String updateSql = "UPDATE "
+ DBHelper.TABLE_MESSAGES + " SET `"
+ DBHelper.COLUMN_MESSAGE_READ_STATUS + "` = ?, `"
+ DBHelper.COLUMN_UPDATED + "` = ? where `"
+ DBHelper.COLUMN_OWNER_ID + "` = ? and `"
+ DBHelper.COLUMN_RELATE_ID + "` = ? and "
+ DBHelper.COLUMN_MESSAGE_ID + " <= ?";
dbMaster.execSQL(updateSql, new Object[] {
readStatus, updated,
ownerId, relateId, msgId
});
boolRtn = true;
} catch (SQLException e) {
logger.e(e.toString());
} finally {
// dbMaster.close();
}
return boolRtn;
}
/**
* 更新两个用户之间的所有收到的消息状态(加载状态)
*
* @param userId 当前登入用户ID
* @param relateId 两个用户之间的联系ID
* @param status 消息状态
* @return Boolean
* @warnning 不能全部设置,需要根据消息的类型,但是在这里判断破坏了db的封装, 目前先这样做 by语鬼,待 @舒沉 回来之后添加接口
*/
public Boolean updateStatus(String userId, int relateId, int status) {
Boolean boolRtn = false;
if (null == userId || 0 == relateId) {
return boolRtn;
}
int updated = (int) (Long.valueOf(System.currentTimeMillis()) / 1000);
SQLiteDatabase dbMaster;
try {
dbMaster = helper.getWritableDatabase();
// 消息状态只在Messages主表中存在,所以单表更新即可
String updateSql = "UPDATE "
+ DBHelper.TABLE_MESSAGES + " SET `"
+ DBHelper.COLUMN_MESSAGE_STATUS + "status` = ?, `"
+ DBHelper.COLUMN_UPDATED + "` = ? where `"
+ DBHelper.COLUMN_OWNER_ID + "` = ? and `"
+ DBHelper.COLUMN_RELATE_ID + "` = ? and `"
+ DBHelper.COLUMN_MESSAGE_TO_USER_ID + "` = ? ";
dbMaster.execSQL(updateSql, new Object[] {
status, updated, userId,
relateId, userId
});
boolRtn = true;
} catch (SQLException e) {
logger.e(e.toString());
} finally {
// dbMaster.close();
}
return boolRtn;
}
/**
* 更新两个用户之间的所有收到的消息状态(是否已读或展现)
*
* @param userId 当前登入用户ID
* @param relateId 两个用户之间的联系ID
* @param readStatus 消息状态(是否已读或展现)
* @return Boolean
* @warnning 不能全部设置,需要根据消息的类型,但是在这里判断破坏了db的封装, 目前先这样做 by语鬼,待 @舒沉 回来之后添加接口
*/
public Boolean updateReadStatus(String userId, int relateId, int readStatus) {
Boolean boolRtn = false;
if (null == userId || 0 == relateId) {
return boolRtn;
}
int updated = (int) (Long.valueOf(System.currentTimeMillis()) / 1000);
SQLiteDatabase dbMaster;
try {
dbMaster = helper.getWritableDatabase();
// 消息状态只在Messages主表中存在,所以单表更新即可
String updateSql = "UPDATE "
+ DBHelper.TABLE_MESSAGES + " SET `"
+ DBHelper.COLUMN_MESSAGE_READ_STATUS + "` = ?, `"
+ DBHelper.COLUMN_UPDATED + "` = ? where `"
+ DBHelper.COLUMN_OWNER_ID + "` = ? and `"
+ DBHelper.COLUMN_RELATE_ID + "` = ? and `"
+ DBHelper.COLUMN_MESSAGE_TO_USER_ID + "` = ? and "
+ DBHelper.COLUMN_MESSAGE_READ_STATUS + " < ? ";
dbMaster.execSQL(updateSql, new Object[] {
readStatus, updated, userId,
relateId, userId, readStatus
});
boolRtn = true;
} catch (SQLException e) {
logger.e(e.toString());
} finally {
// dbMaster.close();
}
return boolRtn;
}
/**
* 更新某条消息的图片存储路径和链接
*
* @param msgId 消息存储的唯一ID
* @param savePath 图片保存文件路径
* @param url 图片的URL
* @param updated 消息更新时间
* @return msgId 成功返回消息ID,失败返回0
*/
public int updateImagePathUrlInfo(int msgId, String savePath, String url,
Byte type, int updated) {
if (SysConstant.DEFAULT_MESSAGE_ID == msgId) {
return msgId;
}
updated = (0 == updated) ? (int) (Long.valueOf(System
.currentTimeMillis()) / 1000) : updated;
SQLiteDatabase dbMaster;
try {
dbMaster = helper.getWritableDatabase();
// 语音信息存在ExtraImage表中,单表更新即可
String updateSql = "UPDATE "
+ DBHelper.TABLE_EXTRA_IMAGE + " SET `"
+ DBHelper.COLUMN_MESSAGE_EXTRA_IMAGE_SAVE_PATH + "` = ?, `"
+ DBHelper.COLUMN_MESSAGE_EXTRA_IMAGE_URL + "` = ? , `"
+ DBHelper.COLUMN_UPDATED + "` = ? where `"
+ DBHelper.COLUMN_MESSAGE_ID + "` = ?";
dbMaster.execSQL(updateSql, new Object[] {
savePath, url, updated,
msgId
});
Logger.getLogger(MessageModel.class).d(
updateSql + "save path = " + savePath + " url =" + url
+ "msgId = " + msgId);
} catch (SQLException e) {
logger.e(e.toString());
} finally {
// dbMaster.close();
}
return msgId;
}
/**
* 更新某条消息的语音存储路径和链接
*
* @param msgId 消息存储的唯一ID
* @param savePath 语音保存文件路径
* @param url 语音的URL
* @param updated 消息更新时间
* @return msgId 成功返回消息ID,失败返回0
*/
protected int updateAudioPathUrlInfo(int msgId, String savePath,
String url, Byte type, int updated) {
if (SysConstant.DEFAULT_MESSAGE_ID == msgId) {
return msgId;
}
updated = (0 == updated) ? (int) (Long.valueOf(System
.currentTimeMillis()) / 1000) : updated;
SQLiteDatabase dbMaster;
try {
dbMaster = helper.getWritableDatabase();
// 语音信息存在ExtraAudio标中,单表更新即可
String updateSql = "UPDATE "
+ DBHelper.TABLE_EXTRA_AUDIO + " SET `"
+ DBHelper.COLUMN_MESSAGE_EXTRA_AUDIO_SAVE_PATH + "` = ?, `"
+ DBHelper.COLUMN_MESSAGE_EXTRA_AUDIO_URL + "` = ? , `"
+ DBHelper.COLUMN_UPDATED + "` = ? where `"
+ DBHelper.COLUMN_MESSAGE_ID + "` = ?";
dbMaster.execSQL(updateSql, new Object[] {
savePath, url, updated,
msgId
});
} catch (SQLException e) {
logger.e(e.toString());
} finally {
// dbMaster.close();
}
return msgId;
}
/**
* 删除一条消息
*
* @param msg
* @return Boolean
*/
public Boolean delete(MessageInfo msg) {
// Boolean boolRtn = false;
// if (null == msg || SysConstant.DEFAULT_MESSAGE_ID == msg.getMsgId()) {
// return boolRtn;
// }
// SQLiteDatabase dbMaster = null;
// try {
// dbMaster = helper.getWritableDatabase();
// dbMaster.beginTransaction();
// int msgId = msg.getMsgId();
// int dt = msg.getDisplayType();
// dbMaster.delete(DBHelper.TABLE_MESSAGES, ""
// + DBHelper.COLUMN_MESSAGE_ID + " == ?",
// new String[] {
// String.valueOf(msgId)
// });
// if (SysConstant.DISPLAY_TYPE_TEXT == dt) {
// // 文本类消息
// dbMaster.delete(DBHelper.TABLE_EXTRA_TEXT, ""
// + DBHelper.COLUMN_MESSAGE_ID + " == ?",
// new String[] {
// String.valueOf(msgId)
// });
// } else if (SysConstant.DISPLAY_TYPE_IMAGE == dt) {
// // 图片消息
// dbMaster.delete(DBHelper.TABLE_EXTRA_IMAGE, ""
// + DBHelper.COLUMN_MESSAGE_ID + " == ?",
// new String[] {
// String.valueOf(msgId)
// });
// } else if (SysConstant.DISPLAY_TYPE_AUDIO == dt) {
// // 语音消息
// dbMaster.delete(DBHelper.TABLE_EXTRA_AUDIO, ""
// + DBHelper.COLUMN_MESSAGE_ID + " == ?",
// new String[] {
// String.valueOf(msgId)
// });
// } else {
// }
//
// dbMaster.setTransactionSuccessful();
// boolRtn = true;
// } catch (SQLException e) {
// logger.e(e.toString());
// } finally {
// if (null != dbMaster) {
// dbMaster.endTransaction();
// }
// // dbMaster.close();
// }
//
// return boolRtn;
return false;
}
/**
* 查询DB中最后一条消息ID
*
* @return msgId
*/
public int queryLastMsgId() {
int lastMsgId = SysConstant.DEFAULT_MESSAGE_ID;
Cursor c = null;
SQLiteDatabase dbSlaver = null;
try {
dbSlaver = helper.getReadableDatabase();
c = dbSlaver.rawQuery("select " + DBHelper.COLUMN_MESSAGE_ID
+ " from " + DBHelper.TABLE_MESSAGES
+ DBHelper.LIMIT_ONE_MESSAGE_SUFFIX, null);
if (c.moveToFirst()) {
lastMsgId = c.getInt(c.getColumnIndex(DBHelper.COLUMN_MESSAGE_ID));
}
} catch (SQLException e) {
logger.e(e.toString());
} finally {
if (null != c) {
c.close();
}
// dbSlaver.close(); //这里不能关闭哦,因为是在其它DB语句中间操作的,由其它DB操作部分关闭即可
}
return lastMsgId;
}
/**
* 查询与所有好友的最后一条聊天信息(不含Extra信息)
*
* @return List<MessageInfo>
*/
public Map<Integer, MessageInfo> queryLastOne(String ownerId) {
HashMap<Integer, MessageInfo> msgHM = new HashMap<Integer, MessageInfo>();
if (null == ownerId) {
return msgHM;
}
SQLiteDatabase dbSlaver = null;
Cursor c = null;
try {
dbSlaver = helper.getReadableDatabase();
String selectSql = "select * from "
+ DBHelper.TABLE_MESSAGES + " where "
+ DBHelper.COLUMN_OWNER_ID + " = '" + ownerId + "' and "
+ DBHelper.COLUMN_RELATE_ID + " in (select "
+ DBHelper.COLUMN_RELATE_ID + " from "
+ DBHelper.TABLE_CONTACTS + ") group by "
+ DBHelper.COLUMN_RELATE_ID + " order by "
+ DBHelper.COLUMN_CREATED + " desc , "
+ DBHelper.COLUMN_MESSAGE_ID + " desc ";
c = dbSlaver.rawQuery(selectSql, null);
MessageInfo msg = null;
while (c.moveToNext()) {
msg = setMsgBaseInfo(c);
msgHM.put(msg.getRelateId(), msg);
}
} catch (SQLException e) {
logger.e(e.toString());
} finally {
if (null != c) {
c.close();
}
// dbSlaver.close();
}
return msgHM;
}
/**
* 根据消息ID查询两个用户之间的某条消息详情(含Extra信息)
*
* @param msgId 消息ID
* @return MessageInfo
*/
public MessageInfo queryByMsgId(int msgId) {
MessageInfo msg = null;
if (SysConstant.DEFAULT_MESSAGE_ID == msgId) {
return msg;
}
Cursor c = null;
Cursor ec = null;
SQLiteDatabase dbSlaver = null;
try {
dbSlaver = helper.getReadableDatabase();
String querySql = "SELECT * FROM " + DBHelper.TABLE_MESSAGES + " where "
+ DBHelper.COLUMN_MESSAGE_ID + " = " + msgId;
c = dbSlaver.rawQuery(querySql, null);
while (c.moveToNext()) {
msg = setMsgBaseInfo(c);
String queryExtraSql = "SELECT * FROM " + DBHelper.TABLE_MESSAGES + " where "
+ DBHelper.COLUMN_MESSAGE_ID + " = " + msgId;
ec = dbSlaver.rawQuery(queryExtraSql, null);
msg = this.setMsgExtraInfo(msg.getDisplayType(), msg, ec);
break;
}
if (null != ec) {
ec.close();
}
} catch (SQLException e) {
logger.e(e.toString());
} finally {
if (null != c) {
c.close();
}
// dbSlaver.close();
}
return msg;
}
/**
* 查询两个用户之间的最后一条消息(不含Extra部分)
*
* @param relateId 两个用户之间的联系ID
* @return MessageInfo
*/
public MessageInfo queryLastOneByRelateId(String ownerId, int relateId) {
MessageInfo msg = null;
if (null == ownerId || 0 == relateId) {
return msg;
}
Cursor c = null;
SQLiteDatabase dbSlaver = null;
try {
dbSlaver = helper.getReadableDatabase();
String selectSql = "SELECT * FROM " + DBHelper.TABLE_MESSAGES + " where "
+ DBHelper.COLUMN_OWNER_ID + " = '" + ownerId + "' and "
+ DBHelper.COLUMN_RELATE_ID + " = " + relateId + " "
+ DBHelper.LIMIT_ONE_MESSAGE_SUFFIX;
c = dbSlaver.rawQuery(selectSql, null);
while (c.moveToNext()) {
msg = setMsgBaseInfo(c);
break; // 只有一条,设置完后即退出循环
}
} catch (SQLException e) {
logger.e(e.toString());
} finally {
if (null != c) {
c.close();
}
// dbSlaver.close();
}
return msg;
}
/**
* 提供给拉取历史消息使用 查询两个用户之间的历史消息
*
* @param relateId 两个用户之间的联系ID
* @param msgId 起始点消息ID,为0时则从最新一条消息开始
* @param offset 距离msgId的偏移量
* @param size 取得的消息条数
* @return List<MessageInfo>
*/
public List<MessageInfo> queryHistoryMsg(String ownerId, int relateId,
int msgId, int offset, int size) {
// List<MessageInfo> msgList = new ArrayList<MessageInfo>();
// if (null == ownerId || 0 == relateId) {
// return msgList;
// }
// Cursor c = null;
// Cursor ec = null;
// SQLiteDatabase dbSlaver = null;
// try {
// dbSlaver = helper.getReadableDatabase();
// String msgSql;
// String msgExtraSql;
// if (0 < msgId) {
// msgSql = "SELECT * FROM " + DBHelper.TABLE_MESSAGES + " where "
// + DBHelper.COLUMN_OWNER_ID + " = '" + ownerId + "' and "
// + DBHelper.COLUMN_RELATE_ID + " = " + relateId + " and "
// + DBHelper.COLUMN_MESSAGE_ID + " < " + msgId + " order by "
// + DBHelper.COLUMN_MESSAGE_ID + " desc, "
// + DBHelper.COLUMN_CREATED + " desc limit " + offset + ", " + size;
// } else {
// msgSql = "SELECT * FROM " + DBHelper.TABLE_MESSAGES + " where "
// + DBHelper.COLUMN_OWNER_ID + " = '" + ownerId + "' and "
// + DBHelper.COLUMN_RELATE_ID + " = " + relateId + " order by "
// + DBHelper.COLUMN_MESSAGE_ID + " desc, "
// + DBHelper.COLUMN_CREATED + " desc limit " + offset + ", " + size;
// }
// c = dbSlaver.rawQuery(msgSql, null);
// MessageInfo msg = null;
// while (c.moveToNext()) {
// msg = setMsgBaseInfo(c);
// int dt = msg.getDisplayType();
// // 根据消息类型完善消息具体内容
// if (SysConstant.DISPLAY_TYPE_TEXT == dt) {
// // 文本类消息
// msgExtraSql = "SELECT * FROM " + DBHelper.TABLE_EXTRA_TEXT + " where "
// + DBHelper.COLUMN_MESSAGE_ID + " = " + msg.getMsgId();
// } else if (SysConstant.DISPLAY_TYPE_IMAGE == dt) {
// // 图片消息
// msgExtraSql = "SELECT * FROM " + DBHelper.TABLE_EXTRA_IMAGE + " where "
// + DBHelper.COLUMN_MESSAGE_ID + " = " + msg.getMsgId();
// } else if (SysConstant.DISPLAY_TYPE_AUDIO == dt) {
// // 语音消息
// msgExtraSql = "SELECT * FROM " + DBHelper.TABLE_EXTRA_AUDIO + " where "
// + DBHelper.COLUMN_MESSAGE_ID + " = " + msg.getMsgId();
// } else {
// // 未知消息,为扩展做准备, 暂时用文本消息替代,留个坑,不知道会不会害人
// msgExtraSql = "SELECT * FROM " + DBHelper.TABLE_EXTRA_TEXT + " where "
// + DBHelper.COLUMN_MESSAGE_ID + " = " + msg.getMsgId();
// }
// ec = dbSlaver.rawQuery(msgExtraSql, null);
// setMsgExtraInfo(dt, msg, ec);
// msgList.add(0, msg); // 插在前面,给个正序List
// if (ec != null)
// {
// ec.close();
// }
// }
//
// } catch (SQLException e) {
// logger.e(e.toString());
// } finally {
// if (null != c) {
// c.close();
// }
// if (null != ec) {
// ec.close();
// }
// // dbSlaver.close();
// }
// return msgList;
return null;
}
/**
* 提供给联系人列表中各个联系人未读消息计数提示 查询与某个用户之间的未读计数
*
* @param relateId 两个用户之间的联系ID
* @return int
*/
public int queryUnreadCountByRelateId(String ownerId, int relateId) {
int unreadCount = 0;
if (null == ownerId || 0 == relateId) {
return unreadCount;
}
Cursor c = null;
SQLiteDatabase dbSlaver = null;
try {
dbSlaver = helper.getReadableDatabase();
String selectSql = "SELECT COUNT(*) AS unread FROM "
+ DBHelper.TABLE_MESSAGES + " where "
+ DBHelper.COLUMN_OWNER_ID + " = '" + ownerId + "' and "
+ DBHelper.COLUMN_RELATE_ID + " = " + relateId + " and "
+ DBHelper.COLUMN_MESSAGE_READ_STATUS + " = " + SysConstant.MESSAGE_UNREAD;
c = dbSlaver.rawQuery(selectSql, null);
while (c.moveToNext()) {
unreadCount = c.getInt(c.getColumnIndex("unread"));
}
} catch (SQLException e) {
logger.e(e.toString());
} finally {
if (null != c) {
c.close();
}
// dbSlaver.close();
}
return unreadCount;
}
/**
* 暂时未被调用 查询某用户(主要是当前登入用户)所有未读消息计数
*
* @param userId 用户ID
* @return int
*/
public int queryUnreadTotalCountByUserId(String userId) {
int unreadCount = 0;
if (null == userId) {
return unreadCount;
}
Cursor c = null;
SQLiteDatabase dbSlaver = null;
try {
dbSlaver = helper.getReadableDatabase();
String querySql = "SELECT COUNT(*) AS unread FROM "
+ DBHelper.TABLE_MESSAGES + " where "
+ DBHelper.COLUMN_OWNER_ID + " = '" + userId + "' and "
+ DBHelper.COLUMN_MESSAGE_TO_USER_ID + " = '" + userId + "' and "
+ DBHelper.COLUMN_MESSAGE_READ_STATUS + " = " + SysConstant.MESSAGE_UNREAD;
c = dbSlaver.rawQuery(querySql, null);
while (c.moveToNext()) {
unreadCount = c.getInt(c.getColumnIndex("unread"));
}
} catch (SQLException e) {
logger.e(e.toString());
} finally {
if (null != c) {
c.close();
}
// dbSlaver.close();
}
return unreadCount;
}
/**
* 提供给聊天界面上未读消息计数提示 查询当前登入用户除某用户(主要是当前聊天对象)之外的所有未读消息计数
*
* @param userId 用户ID
* @param exclUserId
* @return int
*/
public int queryUnreadTotalCountExclUserId(String userId, String exclUserId) {
int unreadCount = 0;
if (null == userId || null == exclUserId) {
return unreadCount;
}
Cursor c = null;
SQLiteDatabase dbSlaver = null;
try {
dbSlaver = helper.getReadableDatabase();
String sql = "SELECT COUNT(*) AS unread FROM " + DBHelper.TABLE_MESSAGES + " where "
+ DBHelper.COLUMN_OWNER_ID + " = '" + userId + "' and "
+ DBHelper.COLUMN_MESSAGE_TO_USER_ID + " = '" + userId + "' and "
+ DBHelper.COLUMN_MESSAGE_FROM_USER_ID + " = '" + exclUserId + "' and "
+ DBHelper.COLUMN_MESSAGE_READ_STATUS + " = " + SysConstant.MESSAGE_UNREAD;
c = dbSlaver.rawQuery(sql, null);
while (c.moveToNext()) {
unreadCount = c.getInt(c.getColumnIndex("unread"));
}
} catch (SQLException e) {
logger.e(e.toString());
} finally {
if (null != c) {
c.close();
}
// dbSlaver.close();
}
return unreadCount;
}
/*
* 设置消息的共通部分
*/
private MessageInfo setMsgBaseInfo(Cursor c) {
int displayType = c.getInt(c.getColumnIndex(DBHelper.COLUMN_MESSAGE_DISPLAY_TYPE));
MessageInfo ojMsg = null;
if (SysConstant.DISPLAY_TYPE_TEXT == displayType) {
// 文本类消息
ojMsg = new MessageInfo(); // 每次都新建一个对象
} else if (SysConstant.DISPLAY_TYPE_IMAGE == displayType) {
// 图片消息
ojMsg = new MessageInfo(); // 每次都新建一个对象
} else if (SysConstant.DISPLAY_TYPE_AUDIO == displayType) {
// 语音消息
ojMsg = new MessageInfo(); // 每次都新建一个对象
} else {
// 未知消息,为扩展做准备
ojMsg = new MessageInfo(); // 每次都新建一个对象
}
//ojMsg.setMsgId(c.getInt(c.getColumnIndex(DBHelper.COLUMN_MESSAGE_ID)));
ojMsg.setMsgParentId(c.getInt(c.getColumnIndex(DBHelper.COLUMN_MESSAGE_PARENT_ID)));
ojMsg.setRelateId(c.getInt(c.getColumnIndex(DBHelper.COLUMN_RELATE_ID)));
ojMsg.setMsgFromUserId(c.getString(c.getColumnIndex(DBHelper.COLUMN_MESSAGE_FROM_USER_ID)));
ojMsg.setTargetId(c.getString(c.getColumnIndex(DBHelper.COLUMN_MESSAGE_TO_USER_ID)));
ojMsg.setMsgOverview(c.getString(c.getColumnIndex(DBHelper.COLUMN_MESSAGE_OVERVIEW)));
ojMsg.setMsgType((byte) c.getInt(c.getColumnIndex(DBHelper.COLUMN_MESSAGE_TYPE)));
ojMsg.setDisplayType(c.getInt(c.getColumnIndex(DBHelper.COLUMN_MESSAGE_DISPLAY_TYPE)));
int loadStatus = c.getInt(c.getColumnIndex(DBHelper.COLUMN_MESSAGE_STATUS));
ojMsg.setMsgLoadState(loadStatus);
ojMsg.setMsgReadStatus(c.getInt(c.getColumnIndex(DBHelper.COLUMN_MESSAGE_READ_STATUS)));
ojMsg.setCreated(c.getInt(c.getColumnIndex(DBHelper.COLUMN_CREATED)));
ojMsg.setUpdated(c.getInt(c.getColumnIndex(DBHelper.COLUMN_UPDATED)));
return ojMsg;
}
/*
* 根据消息展示类型设置消息对象
*/
private MessageInfo setMsgExtraInfo(int displayType, MessageInfo ojMsg,
Cursor c) {
if (SysConstant.DISPLAY_TYPE_TEXT == displayType) {
// 文本类消息
setMsgExtraTextInfo(ojMsg, c);
} else if (SysConstant.DISPLAY_TYPE_IMAGE == displayType) {
// 图片消息
setMsgExtraImageInfo(ojMsg, c);
} else if (SysConstant.DISPLAY_TYPE_AUDIO == displayType) {
// 语音消息
setMsgExtraAudioInfo(ojMsg, c);
} else {
// 未知消息,为扩展做准备
}
return ojMsg;
}
/*
* 设置文本消息特有字段
*/
private MessageInfo setMsgExtraTextInfo(MessageInfo ojMsg, Cursor c) {
while (c.moveToNext()) {
ojMsg.setMsgContent(c.getString(c
.getColumnIndex(DBHelper.COLUMN_MESSAGE_EXTRA_TEXT_CONTENT)));
}
return ojMsg;
}
/*
* 设置图片消息特有字段
*/
private MessageInfo setMsgExtraImageInfo(MessageInfo ojMsg, Cursor c) {
while (c.moveToNext()) {
ojMsg.setSavePath(c.getString(c
.getColumnIndex(DBHelper.COLUMN_MESSAGE_EXTRA_IMAGE_SAVE_PATH)));
ojMsg.setUrl(c.getString(c.getColumnIndex(DBHelper.COLUMN_MESSAGE_EXTRA_IMAGE_URL)));
}
return ojMsg;
}
/*
* 设置语音消息特有字段
*/
private MessageInfo setMsgExtraAudioInfo(MessageInfo ojMsg, Cursor c) {
while (c.moveToNext()) {
ojMsg.setSavePath(c.getString(c
.getColumnIndex(DBHelper.COLUMN_MESSAGE_EXTRA_AUDIO_SAVE_PATH)));
ojMsg.setUrl(c.getString(c.getColumnIndex(DBHelper.COLUMN_MESSAGE_EXTRA_AUDIO_URL)));
ojMsg.setPlayTime(c.getInt(c
.getColumnIndex(DBHelper.COLUMN_MESSAGE_EXTRA_AUDIO_PLAY_TIME)));
}
return ojMsg;
}
}