还有ResultSetVisitor 如下:
import java.sql.ResultSet;public interface ResultSetVisitor
{ public abstract boolean processNextRow(ResultSet resultset); public abstract void setNumberOfRowsAffected(int i);
}
import java.sql.ResultSet;public interface ResultSetVisitor
{ public abstract boolean processNextRow(ResultSet resultset); public abstract void setNumberOfRowsAffected(int i);
}
public void select(String sql, List parameters, ResultSetVisitor aListener)
throws SQLException
{
execQuery(sql, parameters, aListener);
} public void select(String sql, ResultSetVisitor aListener)
throws SQLException
{
execQuery(sql, new ArrayList(), aListener);
}to liuyuw(整狼专家)
好象与你说的inner class 没关系.
不过也谢谢你.我不清楚inner class 是什么样的类.等我找thinking in java 看看再说.
参数:rsc = new ResultSetCounter() {
public boolean processNextRow(ResultSet rs) {}
}
的调用看样子是以 ResultSetCounter 类的实例 rsc 并重载了 接口ResultSetVisitor的方法 processNextRow();
对于 db实例的select(String sql, List parameters, ResultSetVisitor aListener)
方法来说aListener 接收的 是一个方法的地址的引用吗?照这样说 是不是可以用以下方法代替在先另 定义一个 ResultSetCounter的子类,再以原来的代码重载 processNextRow 方法
class ResultSetCounterA extends ResultSetCounter
{
public boolean processNextRow(ResultSet rs) {
try {
id = rs.getInt(1);
type = rs.getInt(2);
topic = rs.getString(3);
info = TextField.getLargeText(rs, 4);
author = rs.getString(5);
url = rs.getString(6);
contentType = rs.getString(7);
date = DateField.getDate(rs, 8);
views = rs.getInt(9);
return super.processNextRow(rs);
}
catch(Exception e) {
e.printStackTrace();
return false;
}
}
}}
然后这样调用:ResultSetCounterA rsca = new ResultSetCounterA();
db.select(SELECT_ARTICLE_BY_ID, params, rsca.processNextRow(ResultSet rs));
不知道我这样理解对不对,而且这样改了后又存在一个问题 processNextRow方法中的ResultSet rs 不知如何而来.因为原代码中db.select()前并没有定义.原码中定义如下:
FDatabase db = FDatabase.getInstance();
List params = new ArrayList();
params.add(new Integer(id));
ResultSetCounter rsc = null;
try {
db.select(SELECT_ARTICLE_BY_ID, params, rsc = new ResultSetCounter() {
public boolean processNextRow(ResultSet rs) {
................
...........前面提到的 db的二个selet方法 就是在类FDatabase 中定义的.
public boolean processNextRow(ResultSet rs) {}
...这样写法是构造一个匿名类并生成其实例
建议参看Thinking in Java 2nd 的第八章
这里的匿名类是ResultSetCounter()的子类,并覆写了其中的一些方法,如processNextRow(ResultSet rs)
2.processNextRow(ResultSet rs) 是public的 也就是可以调用rsc.processNextRow(rs)而
传递参数吧.