一,服务器数据库

   服务器端的数据库是MySQL,使用Hibernate实现数据的增删改查。主要存储的数据有:用户信息,好友列表。
   
    
   其中,好友列表中的friend_list字段是好友ID的集合,格式为 "好友ID1&好友ID2&好友ID3&好友ID4"。
   Hibernate使用:
   1.导入相应的jar
   一般需要hibernate.jar, antlr.jar, commons-collections.jar, commons-logging.jar, dom4j.jar, jta.jar, cglib.jar等,另外还需要数据库驱动类mysql-connector.jar。
这些jar可以在 http://www.hibernate.org 下载。

2.配置文件
   在src目录下,添加一个hibernate.cfg.xml文件,用于配置数据URL,用户名,密码,数据库驱动等。也可以添加一个hibernate.properties文件作为配置文件,格式与一般配置文件一致。

hibernate.cfg.xml

<?xml version="1.0"?>
<!DOCTYPE hibernate-configuration PUBLIC"-Hibernate/Hibernate Configuration DTD 3.0//EN//""http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"><hibernate-configuration><session-factory><property name="connection.driver_class">com.mysql.jdbc.Driver</property><property name="connection.url">jdbc:mysql:///talking</property><property name="connection.username">root</property><property name="connection.password">vaint</property><!-- 这项设置可以在Hibernate每次连接数据库时,都将之前的数据清空。none为不清空 --><property name="hbm2ddl.auto">none</property><!-- 产生统计信息 --><property name="generate_statistics">true</property><!-- 输出每次执行的sql语句 --><property name="show_sql">true</property><!-- 方言,指明使用什么数据库 --><property name="dialect">org.hibernate.dialect.MySQLDialect</property><!-- 映射文件 --><mapping resource="vaint/wyt/db/User.hbm.xml"/><mapping resource="vaint/wyt/db/Friends.hbm.xml"/><!-- 事件监听 --><event type="save"><listener class="org.hibernate.event.def.DefaultSaveOrUpdateEventListener"/></event></session-factory></hibernate-configuration>
   3.JavaBean类
   有两个JavaBean类:User和Friends,分别对应user表(用户信息)和friends表(好友列表)。属性要与表中字段一一对应。
   4.映射文件
   在JavaBean所在目录下添加类名.hbm.xml,比如User.hbm.xml。然后在文件中将JavaBean属性和数据表字段映射起来。映射文件需要在配置文件中配置,如<mapping resource="vaint/wyt/db/User.hbm.xml"/>
   User.hbm.xml
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC"-Hibernate/Hibernate Mapping DTD 3.0//EN//""http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"><hibernate-mapping package="vaint.wyt.db"><class name="User" table="user"><id name="userId" column="user_id"><generator class="assigned"/></id><property name="name" type="string" length="25" /><property name="gender" type="string" length="10" /><property name="password" type="string" length="20"/><property name="photo" type="text" length="2147483647"/></class></hibernate-mapping>

二,客户端数据库

   客户端使用SQLite数据库,主要存储的数据有:好友列表,聊天列表,聊天记录和好友添加请求列表。
好友列表
  
聊天列表
 
聊天记录
  
好友添加 请求列表
 
   由于同一个客户端可能在不同时段,有不同的的账号进行登录,所以账号必须有自己独立的数据库,如果ID:1234的用户数据存储在1234.db中。对于用户与每个好友的聊天记录,则存储在以该好友ID命名的聊天记录表中(因为SQLite不支持数字字符串作为表名的首字,所以特定添加了chatting_前缀)。
   另外,聊天列表,聊天记录和好友添加请求列表的属性,都是根据界面显示的需要设计的。
 
 
   
SQLite数据操作:
1.创建表(DBHelper类)
public class DBHelper extends SQLiteOpenHelper{private static final int DATABASE_VERSION = 1;/**好友列表 表名*/public static final String FRIENDS = "friends";/**聊天列表 表名*/public static final String CHAT_LIST = "chat_list";/**好友请求 表名*/public static final String NEW_FRIENDS = "new_friends";/**聊天记录表名前缀*/public static final String CHATTING_PREFIX = "chatting_";/**@param userId 以当前用户ID作为数据库名称*/public DBHelper(Context context,String userId) {//CursorFactory设置为null,使用默认值super(context, userId, null, DATABASE_VERSION);}//数据库第一次被创建时onCreate会被调用@Overridepublic void onCreate(SQLiteDatabase db) {//好友列表db.execSQL("CREATE TABLE IF NOT EXISTS " + FRIENDS + " (friend_id VARCHAR(20) PRIMARY KEY, name VARCHAR(25), gender VARCHAR(10), photo TEXT)");//聊天列表db.execSQL("CREATE TABLE IF NOT EXISTS  " + CHAT_LIST + " (friend_id VARCHAR(20) PRIMARY KEY, unread INTEGER, content VARCHAR(20), time VARCHAR(10))");//好友请求列表db.execSQL("CREATE TABLE IF NOT EXISTS  " + NEW_FRIENDS + " (user_id VARCHAR(20) PRIMARY KEY, name VARCHAR(25), gender VARCHAR(10), verify_msg VARCHAR(20), time VARCHAR(10), is_agree INTEGER, photo TEXT)");}/**创建对应好友的聊天记录表,由于聊天记录表名需要根据好友ID来确定,所以只能在需要时新建*/public void createChattingTable(SQLiteDatabase db, String dbName){db.execSQL("CREATE TABLE IF NOT EXISTS " + dbName + " (id INTEGER PRIMARY KEY AUTOINCREMENT, time VARCHAR(10), msg TEXT, send INTEGER, show_time INTEGER)");}//如果DATABASE_VERSION值被修改,系统发现现有数据库版本不同,即会调用onUpgrade@Overridepublic void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {}}

2.增删改查(DBManager类)

以聊天列表为例,主要有获取和更新操作。
public class DBManager {/** 获得聊天列表信息 */public List<ChatListModel> GetChatList() {List<ChatListModel> chatList = new ArrayList<ChatListModel>();// 查询所有聊天列表数据Cursor cursor = mSQLite.rawQuery("SELECT * FROM " + DBHelper.CHAT_LIST,null);while (cursor.moveToNext()) {ChatListModel model = new ChatListModel();// friend_id , unread , content , timeString friendId = cursor.getString(cursor.getColumnIndex("friend_id"));model.setFriendId(friendId);model.setContent(cursor.getString(cursor.getColumnIndex("content")));model.setTime(cursor.getString(cursor.getColumnIndex("time")));model.setUnread(cursor.getInt(cursor.getColumnIndex("unread")));//ChatListModel的title和photo需要从friends表中获取Cursor c = mSQLite.rawQuery("SELECT * FROM " + DBHelper.FRIENDS + " WHERE friend_id=?",   new String[]{friendId});if(c.moveToNext()){model.setTitle(c.getString(c.getColumnIndex("name")));model.setPhoto(c.getString(c.getColumnIndex("photo")));}chatList.add(model);}cursor.close();return chatList;}/** 更新聊天列表信息 覆盖更新 */public void UpdateChatList(List<ChatListModel> chatList) {ChatListModel model;// 开启事务mSQLite.beginTransaction();// 清空原来的聊天列表数据mSQLite.delete(DBHelper.CHAT_LIST, null, null);try {for (int i = 0; i < chatList.size(); i++) {model = chatList.get(i);// friend_id , unread , content , time mSQLite.execSQL("INSERT INTO " + DBHelper.CHAT_LIST + " VALUES(?, ?, ?, ?)",new Object[] { model.getFriendId(), model.getUnread(),model.getContent(), model.getTime()});}// 设置事务成功,不设置则回滚不提交mSQLite.setTransactionSuccessful();} finally {// 结束事务mSQLite.endTransaction();}}
}

3.缓存机制
除了需要将当前登录用户的信息进行缓存外,数据库数据也可以通过使用缓存,减少数据库的操作。并且将数据的修改 操作(比如聊天列表项位置的改动)在缓存中完成,可以简化复杂度。
还是以聊天列表为例。
public class CacheUtils {private static List<ChatListModel> chatList = null;/**缓存聊天列表*/public static void UpdateChatList(List<ChatListModel> list) {chatList = list;}/** 根据好友列表信息更新聊天会话信息。* 如头像和昵称<BR/>需要判断返回值是否为null,再进行本地化存储 */public static List<ChatListModel> UpdateChatList(FriendList friendList) {if(chatList == null)return null;for(int i=0;i<chatList.size();i++){ChatListModel model = chatList.get(i);String friendId = model.getFriendId();User user = friendList.getFriendsMap().get(friendId);if(user!=null){//更新数据model.setPhoto(user.getPhoto());model.setTitle(user.getName());//删除原数据chatList.remove(i);//插入新数据chatList.add(i, model);}}return chatList;}/**更新对应好友的聊天列表信息*/public static List<ChatListModel> UpdateChatList(String friendId, ChatListModel model){if(chatList == null)chatList = new ArrayList<ChatListModel>();int index = GetChatPosition(friendId);if(index != -1)//聊天会话已经存在{ChatListModel m = chatList.remove(index);//删除原记录//未读消息数目:原来+本次int unread = m.getUnread() + model.getUnread();model.setUnread(unread);}chatList.add(0, model);//添加到首位return chatList;}/*** 删除聊天列表中的对应会话<BR/>* @return 返回true,说明原来该好友的聊天会话存在,需要更新本地数据,以及删除对应聊天记录<BR/>* 否则无需更新其他数据*/public static boolean RemoveChat(String friendId){int index = GetChatPosition(friendId);if(index != -1)//聊天会话存在{chatList.remove(index);//删除原记录return true;}return false;}/**获得聊天列表*/public static List<ChatListModel> GetChatList(){return chatList;}/**根据好友ID,获得聊天会话在聊天列表的位置。-1表示会话不存在,需要新建*/private static int GetChatPosition(String friendId){if(chatList == null)return -1;for(int i=0; i<chatList.size(); i++){ChatListModel model = chatList.get(i);if(model.getFriendId().equals(friendId)){return i;}}return -1;}
}

首页  Android聊天软件的开发

Android聊天软件的开发(二)--数据库相关推荐

  1. Android聊天软件的开发(四)--通讯录

    一,好友排序    好友排序是按照昵称拼音进行A-Z排序.效果如下图:      对好友昵称进行排序,需要先将首字转换为ASCII码,然后根据ASCII码得到对应的拼音,最后根据拼音进行A-Z排序.点 ...

  2. Android聊天软件的开发(三)--网络连接

    一,服务器网络接口    服务器网络接口通过Servlet实现,可以获得客户端提交的数据,对数据进行查询存储操作,以及返回结果数据给客户端.客户端可以通过HTTP协议直接访问网络接口.    HTTP ...

  3. Android聊天软件的开发(七)--聊天通信

    聊天通信通过Socket实现,大概的框架如下图: 通信流程: 1.服务器在启动时开启聊天服务线程 可以通过ServletContextListener监听Servlet的初始化和销毁,来开启和关闭聊天 ...

  4. Android聊天软件的开发--聊天通信

    Android聊天软件的开发(七)--聊天通信 2014-06-20 23:17:49CSDN-vaintwyt-点击数:338  聊天通信通过Socket实现,大概的框架如下图: 通信流程: 1.服 ...

  5. Android聊天软件的开发(六)--表情

    表情用于聊天对话的输入,实现的原理主要是:在EditText或TextView中,使用SpannableString,将特定字符串替换为图片. 首先,我们可以规定,表情的字符串为[**],图片名称为s ...

  6. Android聊天软件界面开发

    聊天软件界面开发 前言:           这是开始学习Android的开发的第5天,一直是跟着郭霖大师的第一行代码学习,              这里边发篇博文记录,边帮自己整理下思路,毕竟思路 ...

  7. 开发简单Android聊天软件(6)

    构建完整消息接收加载流程 在 "开发简单Android聊天软件(5)" 中,完成了会话窗口的绘制,以及消息发送.现在我们来完成消息接收和加载,构建一个完整的聊天流程. 消息加载,那 ...

  8. 开发简单Android聊天软件(1)

    总体介绍 开篇 大概思路 一. 客户端主要依赖 二.包引用完成后,创建wsClient类. 三.连接成功后,就可以在对于业务逻辑调用以下方法开始发送消息 开篇 本人是一位开发新人,将自己的开发学习过程 ...

  9. 开发简单Android聊天软件(7)

    构建离线消息获取流程 在 "开发简单Android聊天软件(6)" 中,完成了完成消息接收和加载,构建一个完整的聊天流程. 但是我们只完成了一半,完成存量历史记录展示,和即时聊天的 ...

最新文章

  1. **kwargs特有的作用
  2. 工业以太网在工业领域的应用特点详解
  3. 5_1 大理石在哪儿(UVa10474)排序与查找
  4. 私有化 Serverless Application 的探索与思考
  5. eclipse java项目目录结构_最全的 eclipse web 项目目录结构以及Tomcat的各个目录的作用...
  6. win10电脑便签怎么换行 电脑便签记事本换行的两种方法
  7. 计算机的硬盘和光驱的接口是什么类型的接口,连接硬盘和光驱是什么接口
  8. 【无标题】互联网广告投放优势和前景
  9. FPGA中latch
  10. html背景自动适应,css背景图片如何自适应?
  11. 电商系统开发实战-用户微服务基础模块开发
  12. 基于空间金字塔网络的光流估计
  13. JS逆向案例文章推荐
  14. 金蝶EAS 客户端查询分析器 geninsert 用法
  15. 电磁炉场效应功率管的代换问题
  16. 三层架构之数据访问层(DAL)
  17. 错误源计算机检,Voevodsky | 单一基础的源起——为避免数学错误而发展计算机验证证明的个人使命...
  18. c++ vs 创建删除文件_一键发布部署vs插件[AntDeploy]开源了
  19. RC4 16进制字符串加解密
  20. C# 使用TWAIN协议进行扫描仪操作

热门文章

  1. iOS6之后 NSAttributedString 的福利
  2. 关注这几点,远程办公不犯迷糊
  3. react-redux的初级使用(react初学者笔记)
  4. 2022前端面试宝典(初级简洁版)
  5. 无法清除计算机的主dns,修复本地连接无法清除DNS缓存的的解决方案
  6. 50首音乐,喝茶时听一听,身心舒畅
  7. Linux virtual filesystem switch I 磁盘相关概念以及知识
  8. Eclipse美(黑)化攻略
  9. matlab交流电路仿真,【基于MATLAB的三相整流电路仿真研究最终版材料】
  10. 二次开发如何让低代码平台锦上添花?