一、下载并安装openfire
1.到http://www.igniterealtime.org/downloads/index.jsp下载最新openfire for mac版
比如:Openfire 3.8.1,下载后的文件:openfire_3_8_1.dmg
2.点击安装,并执行默认操作
3.启动openfire服务
在系统偏好设置的其他里,点击openfire偏好
启动后,点击Open Admin Console按钮,自动在浏览器中打开本地web配置页面http://localhost:9090/setup/index.jsp
二、配置openfire服务器
1.设置语言,选中文
2.主机设置
设置主机的访问ip地址
注意:域不能是机器名,否则会如下错误:
HTTP ERROR: 500 INTERNAL_SERVER_ERROR
本地的域,要设置为127.0.0.1
3.数据库设置
如果要设置外部数据库(推荐,比如:MySQL),选择标准数据库连接
4.设置数据库连接
(1)数据库驱动选择:MySQL,前提是已安装MySQL(具体的安装方法可以参考上一篇:mac上安装MySQL)
(2)JDBC驱动,默认不变
com.mysql.jdbc.Driver
(3)数据库URL:
形式如下:
jdbc:mysql://你的主机名:端口号/数据库名称
这里设置为
jdbc:mysql://localhost:3306/openfire
其中主机名[host-name]改为localhost,
其中数据库名称[database-name]改为openfire
解决数据库字符编码问题,可以在后面加
?useUnicode=true&characterEncoding=UTF-8&characterSetResults=UTF-8
最终的url形式是
jdbc:mysql://localhost:3306/openfire?useUnicode=true&characterEncoding=UTF-8&characterSetResults=UTF-8
注意:前提是已存在一个名为openfire的数据库,否则会报如下错误,连接配置不成功
The Openfire database schema does not appear to be installed. Follow the installation guide to fix this error.
前期的MySQL数据库准备工作如下:
<1>设置/usr/local/openfire文件夹的访问权限为可读写
方法1:在finder中前往文件夹/usr/local/,右键openfire文件夹,显示简介
点击如图右下角中的锁图标解锁,并设置权限为:可以读写
方法2:打开终端,输入如下命令
sudo chmod 777 /usr/local/openfire
其中777表示授权可读写权限,000表示无访问权限
<2>在终端中,登陆MySQL
mysql -u root -p
然后输入数据库的root密码
<3>创建数据库openfire
create database openfire;
<4>导入openfire资源文件夹 resources/database下的数据表
use openfire;
source /usr/local/openfire/resources/database/openfire_mysql.sql
在终端出现一排导入过程
<5>刷新权限
flush privileges;
<6>退出MySQL
exit
(4)用户名和密码
这里的用户名密码,是访问MySQL数据库时使用的帐号:root,和安装MySQL设置的root密码
5.特性设置
如果不打算使用LDAP,则保持默认设置
6.设置openfire服务器管理员的帐号和密码
可以随便填写一个管理员邮箱,输入要设置的密码
完成注册
7.登陆管理控制台
(如果可以往数据库里插入用户但是在用户摘要却没有数据,这是因为openfire的数据库驱动包太旧了,而安装的数据库太新了,把openfire里的驱动包换成新的就行了,路径:/usr/local/openfire/lib)
默认的管理员帐号是“admin”,默认管理员密码“admin”,如果上面设置了新密码,则管理员密码是新密码
如果想去掉默认的admin帐号,并自定义,需要如下操作
(1)在终端中,登陆具体的数据库(openfire)
mysql -u root -p openfire
然后输入数据库的root密码
(2)删除表“ofUser”中的admin帐户
delete from ofUser where username='admin';
(3)创建自定义管理员(用户名:xiaodao,密码:123)
INSERT INTO ofUser (username, plainPassword, encryptedPassword, name, email, creationDate, modificationDate) VALUES ('xiaodao','123','123','Administrator','xiaodao@sunyard.com','0','0');
注意:如果重设了用户名,必须重启openfire服务器
8.后台控制界面
三、卸载openfire
1.停止服务
在系统偏好设置的其他里,打开openfire偏好设置
点击Stop Openfire按钮,停止服务
2.删除文件
打开终端,输入以下命令
sudo rm -rf /Library/PreferencePanes/Openfire.prefPane
sudo rm -rf /usr/local/openfire
sudo rm -rf /Library/LaunchDaemons/org.jivesoftware.openfire.plist
如何把数据上传到EBS的forms的数据块中
创建一个临时表: XXX_TEMP_FILES
建表语句是:
CREATE TABLE XXX_TEMP_FILES (
FILE_ID NUMBER,
SEQ NUMBER,
TEXT VARCHAR2(2000),
CREATION_DATE DATE
)
创建这个表的目的就是要把数据从FND_LOBS这个表的file_data这个字段的数据,通过程序,因为这个表的这个数据是lobs类型的,所以整个文件都放在这个字段里,我们利用这个临时表,把数据文件拆成一行一个纪录.然后每行在根据分个符查分.
2. 创建上传包: XXX_FILE_IO
XXX_FILE_IO 包含三个子程序:
INS_TEMP_FILES:从fnd_lobs 表中取上传的数据,把它按行来拆分,并插入到: XXX_TEMP_FILES 表中
SEL_TEMP_FILES:从XXX_TEMP_FILES 中把数据去出
DEL_TEMP_FILES:数据已经上传到Form的界面中,需要删除文件.
主要语句就是:
PROCEDURE INS_TEMP_FILES(p_file_id IN NUMBER) IS
w_integer INTEGER;
w_blob BLOB;
w_raw RAW(10);
w_buff VARCHAR2(30000);
w_line VARCHAR2(30000);
w_len INTEGER;
eofsw BOOLEAN := FALSE;
offset INTEGER;
w_b_len NUMBER := 0;
w_num NUMBER;
w_seq NUMBER := 0;
BEGIN
SELECT file_data INTO w_blob FROM fnd_lobs WHERE file_id = p_file_id;
offset := 1;
LOOP
EXIT WHEN eofsw;
w_seq := w_seq + 1;
w_raw := utl_raw.cast_to_raw(chr(10));
w_num := dbms_lob.instr(w_blob, w_raw, offset, 1);
w_len := w_num - w_b_len;
w_b_len := w_num;
IF w_num = 0
THEN
w_len := 20000;
eofsw := TRUE;
END IF;
BEGIN
DBMS_LOB.READ(w_blob, w_len, offset, w_buff);
EXCEPTION
WHEN no_data_found THEN
EXIT;
WHEN OTHERS THEN
RAISE;
END;
w_line := utl_raw.cast_to_varchar2(w_buff);
SELECT REPLACE(w_line, chr(10), NULL) INTO w_line FROM dual;
SELECT REPLACE(w_line, chr(13), NULL) INTO w_line FROM dual;
INSERT INTO XXX_TEMP_FILES
(FILE_ID, SEQ, TEXT, CREATION_DATE)
VALUES
(p_file_id, w_seq, w_line, SYSDATE);
offset := offset + w_len;
END LOOP;
END;
3. 在Form文件中的Program Unit中健一个包.XXX_UPLOAD
这个文件最好做成PLL,和其他客制化的有用的程序一起打包,上传到form这是一个系统比较有用的通用的程序.
主要是利用FND_GFM这个通用上传的工具,把文件传到,FND_LOBS中去,然后第二步建好的的包,进行数据拆分:
p_file_id := NULL;
access_id := FND_GFM.AUTHORIZE(NULL);
FND_PROFILE.GET('APPS_WEB_AGENT', l_server_url);
l_url := rtrim(l_server_url, '/') ||
'/fnd_file_upload.displayGFMform?access_id=' ||
to_char(access_id) ||
chr(38) ||
'l_server_url=' ||
l_server_url;
if (l_url is NULL) then
raise form_trigger_failure;
return NULL;
end if;
FND_UTILITIES.OPEN_URL(/blog_article/l_url/index.html);
FND_MESSAGE.SET_NAME('FND', 'ATCHMT-FILE-UPLOAD-COMPLETE');
button_choice := FND_MESSAGE.QUESTION(
button1 => 'YES',
button2 => null,
button3 => 'NO',
default_btn => 1,
cancel_btn => 3,
icon => 'question'
);
if button_choice = 1 then
p_file_id := FND_GFM.GET_FILE_ID(access_id);
XXX_FILE_IO.INS_TEMP_FILES(p_file_id);
-- pcm_dbms_lob.UPOPEN(p_file_id);
else
return NULL;
end if;
return p_file_id;
1. 在Form文件中的Program Unit中健一个程序如: UPLOAD_XXX_XXX(X根据实际需要转换)
UPLOAD_XXX_XXX 这个文件的需要在实际的应用中作改动,根绝实际的要导入的字段修改程序.主要功能就是从XXX_TEMP_FILES把数据读出,然后根据分割符来,把每个数据对应到form的域中.
快速拖动 上下拖动很卡的原因 listView中有大量的图片,每张图片在生存时候会花200毫秒,
解决:利用listView的懒加载 :当拖动时候不去加载ListView中的条目,当用户停止的时候才
真正去加载这个条目
判断ListView的状态,如果ListView是处于滚动状态,返回一个假的View对象,gieView()执行很快
只有当listView处于静止状态的时候,才去真正去更新里面显示的内容
5.listview的懒加载
判断listview的状态,如果listview是处于滚动状态.返回一个假的view对象.
只有当listview处于静止状态的时候 ,才去真正的更新里面所显示的内容.
1.在activity创建的时候,获取到所有的缩略图...
2.在adapter的getview的方法里面判断 当前listview是否处于滚动状态.
滚动状态可以通过 listview的setonscroollistener的方式 处理
onScrollStateChanged(AbsListView view, int scrollState) {
switch (scrollState) {
case OnScrollListener.SCROLL_STATE_IDLE:
滚动= false;
break;
case OnScrollListener.SCROLL_STATE_TOUCH_SCROLL:
滚动= true;
break;
case OnScrollListener.SCROLL_STATE_FLING:
滚动= true;
break;
如果是滚动状态 就只返回,缩略图.
并且把真实图片的id存储起来.并且可以储存当前imageview的引用.
3.当滚动状态变成静止的时候 再去真正的加载每个真实的图片.
在case OnScrollListener.SCROLL_STATE_IDLE:
//获取第一个listview可见的条目的位置
int first = listview.getFirstVisiblePosition();
// 获取listview里面显示的条目的个数.
int count = view.getChildCount();
通过for循环 更新所有的图片
for (int i=0; i<count; i++) {
拿到图片的id,和imageview,更新里面的内容.
}
这种方法,可以解决掉拖动卡顿的现象.