直接操作数据库数据来为Openfire用户添加好友

[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]

时间: 2024-10-11 14:29:12

直接操作数据库数据来为Openfire用户添加好友的相关文章

直接操作数据库数据来为Openfire注册新用户

众所周知,Openfire的注册方式一般有三种: 1.带内注册  ---- In-Band Registration. 即客户端通过匿名方式与Openfire 服务器端建立连接并验证,然后发起注册节点XML流,以XMPPStream的方法直接像服务器注册.code4app上有另外一个XMPP的带内注册demo详细的示范了这个方法(不是我写的). 优点:不需假设额外的服务器端,适合对java一窍不通的开发者. 弊端:不容易管理用户账号.用户注册的JID无规律,不能够自增长.安全性低. 2.Open

本篇文章主要是对jquery+ajax+C#实现无刷新操作数据库数据的简单实例进行了介绍,需要的朋友可以过来参考下,希望对大家有所帮助

我们知道同步执行和异步执行的区别,为了更好的提高用户的体验,我们都会采用异步方式去处理一些问题,毕竟单线程的同步可能回造成卡死等现象,很不友好,所以可以使用ajax来完成用户的体验,现在我们就来说说如何使用jquery的ajax来实现无刷新的获取内容 我们只是单方面的获取内容,分页等就不考虑了,后期会讲到无刷新的分页 页面中我们放置一个Div容器用来存放返回的内容 <div id="comment"><img src="images/Wait.gif&quo

python操作数据库-数据表

数据表: 数据类型: 帮助的三种形式: 在cmd中输入: help 要帮助的主题词,或 ? 要帮助的主题词 或  \h 要帮助的主题词 . 数据表的创建: CREATE database IF NOT exists zbltest2 default character set 'utf8'; USE zbltest2; CREATE TABLE IF NOT EXISTS `user`( id SMALLINT, username VARCHAR(20) ) ENGINE=INNODB CHAR

MySQL数据库(7)_用户操作与权限管理、视图、存储过程、触发器、基本函数

用户操作与权限管理 MySQL用户操作 创建用户 方法一: CREATE USER语句创建 CREATE USER "用户名"@"IP地址" IDENTIFIED BY "密码"; 方法二: INSERT语句创建 INSERT INTO mysql.user(user,host, password,ssl_cipher,x509_issuer,x509_subject) VALUES('用户名','IP地址',password('密码'),'',

Oracle 数据库 数据文件 表 表空间 用户的关系

这涉及到数据库的物理结构和逻辑结构. 首先,你需要明白的一点是:数据库的物理结构是由数据库的操作系统文件所决定,每一个Oracle数据库是由三种类型的文件组成:数据文件.日志文件和控制文件.数据库的文件为数据库信息提供真正的物理存储. 每一个Oracle数据库有一个或多个物理的数据文件(data file).一个数据库的数据文件包含全部数据库数据.逻辑数据库结构(如表.索引等)的数据物理地存储在数据库的数据文件中.数据文件通常为*.dbf格式,例如:userCIMS.dbf.数据文件有下列特征:

mysql基本认识【关系型数据库和nosql、mysql操作流程和体系,库操作,表操作,数据的操作,字符集的操作,以及php作为client操作数据库】对连接本身没有疑问

1.关系型数据库永久性保存数据的仓库php的变量只是php脚本执行期间,临时性保存变量的空间[使用内存空间临时保存] 关系型数据库:利用二者的关系来描述实体的信息.[利用二维表字段名和字段值来进行描述][关系型数据库根本不是可以使用外键将两个表构建成关联的意思,而是实现描述实体的二维表的形式] nosql:not only sql[sql表示操作关系型数据的语言]所以nosql指的就是非关系型数据库[典型的是键值对型的数据(redis.memcache)][nosql可以视情况添加信息,不需要对

MySql数据库基础操作——数据库、用户的创建,表的制作、修改等

MySql 是一款使用便捷.轻量级的数据库.因为他体积小.速度快.安装使用简单.开源等优点,目前是使用最广泛的数据库.目前位于Oracle甲骨文公司旗下.那今天我们就来介绍一下数据库的基本操作.具体介绍通过指令的方式来操作数据库. 首先,连接数据库的软件很多,比如说 Navicat 等软件.通过这些软件可以轻松便捷的操作数据库,但是今天的重点不在这. 我们今天普及一下指令操作的方式操作MySql数据库. 我们主要从以下 4 个方面介绍: 1.数据库的 创建.删除.查询 等语句 跳转 2.用户的

Qt的Model/View Framework解析(数据是从真正的“肉(raw)”里取得,Model提供肉,所以读写文件、操作数据库、网络通讯等一系列与数据打交道的工作就在model中做了)

最近在看Qt的Model/View Framework,在网上搜了搜,好像中文的除了几篇翻译没有什么有价值的文章.E文的除了Qt的官方介绍,其它文章也很少.看到一个老外在blog中写道Model/View是他认为Qt中最不好的一部分了.真的是这样吗?为了回馈开源社区,我写了这篇blog,写的是我认为比较有价值的东东.题目起得是解析,但也没有特别细节的介绍,点到为止,有兴趣的Tx可以继续讨论.我所看的资料有<C++ GUI Programming with Qt 4, Second Edition

几种通过JDBC操作数据库的方法,以及返回数据的处理

1.SQL TO String :只返回一个查询结果 例如查询某条记录的总数 rs = stmt.executeQuery(replacedCommand);             if (rs != null && rs.next()) // rs only contains one row and one column             {                    String tempStr = rs.getString(1);