[size=large]openfire中实现好友添加及分组管理。
主要基于两张table实现:ofroster,ofrostergroups。
ofroster:用于记录好友关系(一对好友关系用两条记录来实现)
ofrostergroups:用于记录好友分组
特别说明:openfire中用户的主键是自然主键,也就是username。没有使用自增ID。
我们先来看一下官方(http://www.igniterealtime.org/builds/openfire/docs/latest/documentation/database-guide.html)对 两张表的描述:
ofRoster (好友列表)
[table]
|列名 |类型 |长度 |描述 |
|rosterID |NUMBER |n/a |编号名册(主键) |
|username |VARCHAR |32 |用户名 |
|jid |TEXT |n/a |地址名册入境 |
|sub |NUMBER |n/a |认购地位入境 |
|ask |NUMBER |n/a |卖出地位入境 |
|recv |NUMBER |n/a |检举表明进入名册收到请求 |
|nick |VARCHAR |255 |昵称分配给这个名册入境 |
[/table]
ofRosterGroups (组的好友名单中的条目)
[table]
|列名 |类型 |长度 |描述 |
|rosterID |NUMBER |n/a |名册编号(主键) |
|rank |NUMBER |n/a |立场项(主键) |
|groupName |VARCHAR |255 |用户定义的名称,这个名册组|
[/table]
看不太明白?不要着急,我们慢慢分析。
假设有用户A,用户B。
当A申请加B为好友时(例如:A将B加入好亲人的分组中)。会在ofroster表中插入两条记录,
rosterID username jid sub ask recv nick
1 A 0 0 -1 B
2 B 0 -1 1 null
同时往ofrostergroups表中插入一条记录
rosterID rank groupName
1 0 亲人
这时B同意将A加为好友,并设置为家人分组中,那么会修改ofroster表中刚插入的两条记录,如下所示:
rosterID username jid sub ask recv nick
1 A 1 -1 1 B
2 B 2 0 -1 null
同时往ofrostergroups表中插入一条记录.
rosterID rank groupName
2 0 家人
到此为止,双方的好友关系便建立起来。
疑问:1.若B不同意呢?则不做任何操作。下一次,若B加A为好友,将等同于执行同意的操作。
2.如何查询某个人所有好友,和分组?
在ofroster中根据username便可获得某个用户的所有好友信息。然后根据每条记录的rosterid去ofrostergroups表中查找分组的名称即可。
3.当用户添加一个空的好友分组时,ofrostergroups表是否插入一条记录?
不插,测试发现并没有实质的插入一条记录,但用户可以看到这个分组名称,怎么回事?推测可能是存放在session中。测试发现当用户创建一个空的好友分组,然后下线,再上线时,发现该好友分组已消失。充分说明当好友分组为空时,并没有插库。
下面说一下每个字段所代表的含义:
askstatus
-1— 没有挂起的添加好友请求。
The roster item has no pending subscription requests.
0— 有挂起的添加好友请求。
The roster item has been asked for permission to subscribe to its presence but no response has been received.
1— 估计是有没有回复的删除请求吧
The roster owner has asked the roster item to be unsubscribed from its presence notifications but hasn‘t yet received confi rmation.
recvstatus
-1— 已经回复添加好友请求
There are no subscriptions that have been received but not presented to the user.
1— 接收到好友请求但是没有给好友回复
The server has received a subscribe request, but has not forwarded it to the user.
2— 估计是没有回复删除请求吧
The server has received an unsubscribe request, but has not forwarded it to the user.
substatus
-1— 应该删除这个好友
Indicates that the roster item should be removed.
0— 没有建立好友关系
No subscription is established.
1— 用户已经发出好友请求
The roster owner has a subscription to the roster item’s presence.
2— 收到好友请求并且加对方好友
The roster item has a subscription to the roster owner’s presence.
3— 好友已经相互添加
The roster item and the owner have a mutual subscription.
知道了这些之后也就大体明白了添加好友的过程,下面就是我们代码的操作[/size]
[code="java"]public static void main(String[] args) {
ResultSet rs = null;
Statement stmt = null;
Connection conn = null;
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
//new oracle.jdbc.driver.OracleDriver();
conn = DriverManager.getConnection("jdbc:oracle:thin:@192.168.1.85:1521:ORCL", "test", "test");
stmt = conn.createStatement();
//aaa与eee互加好友
String sql="insert into OFROSTER values(‘30‘,‘eee‘,‘[email protected]‘,‘3‘,‘-1‘,‘-1‘,‘aaa‘)";
stmt.execute(sql);
String sql2="insert into OFROSTER values(‘31‘,‘aaa‘,‘[email protected]‘,‘3‘,‘-1‘,‘-1‘,‘eee‘)";
stmt.execute(sql2);
//将aaa与eee放到Friend分组中
String sql3="insert into OFROSTERGROUPS values(‘30‘,‘0‘,‘Friend‘)";
stmt.execute(sql3);
String sql4="insert into OFROSTERGROUPS values(‘31‘,‘0‘,‘Friend‘)";
stmt.execute(sql4);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
} finally {
try {
if(rs != null) {
rs.close();
rs = null;
}
if(stmt != null) {
stmt.close();
stmt = null;
}
if(conn != null) {
conn.close();
conn = null;
}
} catch (SQLException e) {
e.printStackTrace();
}
}
} [/code]
[size=large]这是我用JDBC直接操作数据库的操作,一开始好像不行,后来我又添加了openfire官方提供的一个插件:SubscriptionPlugin,这个插件的主要实现自动添加了好友的功能。添加完成之后就可以了。
有什么问题可以留言[/size]