方法fetchDataByName(String)未定义类型new FilterQueryProvider

时间:2013-03-25 09:36:15

标签: java android listview adapter

我有以下方法,从数据库中提取数据

public Cursor fetchDataByName(String inputText) throws SQLException {
       Log.w(TAG, inputText);
       Cursor mCursor = null;
       if (inputText == null  ||  inputText.length () == 0)  {
            mCursor = db.query(
            .......
            return mCursor;
       }

我想在ListView中使用自定义适配器显示结果 但我的代码中有错误。

dataAdapter.setFilterQueryProvider(new FilterQueryProvider() {
       public Cursor runQuery(CharSequence constraint) {
              return this.fetchDataByName(constraint.toString()); //error here
       }

错误消息:

  

类型fetchDataByName(String)

的方法new FilterQueryProvider未定义

错误似乎很明显,但我无法弄清楚如何解决它。如何更新我的代码以获得我想要的行为?

2 个答案:

答案 0 :(得分:0)

您已在某个数据库类中定义了fetchDataByName(),但尝试将此方法称为FilterQueryProvider的成员。如果要从runQuery()访问它,则必须具有数据库类的实例

class DatabaseAdapter {
    public Cursor fetchDataByName(String inputText) throws SQLException {
    ...
    }
}

DatabaseAdapter adapter = ...;

dataAdapter.setFilterQueryProvider(new FilterQueryProvider() {
                  public Cursor runQuery(CharSequence constraint) {
                      return adapter.fetchDataByName(constraint.toString());
                  }

如果方法fetchDataByName()和对setFilterQueryProvider()的调用都在同一个类中,您可以省略this.

dataAdapter.setFilterQueryProvider(new FilterQueryProvider() {
                  public Cursor runQuery(CharSequence constraint) {
                      return fetchDataByName(constraint.toString());
                  }

答案 1 :(得分:0)

使用this的匿名类内部不会有帮助,因为它引用了当前对象,因此您可以在不使用this的情况下尝试

return OuterClassName.this.fetchDataByName(constraint.toString());

现在,由于fetchDataByName(String)方法会引发SQLException,因此您必须包含try catch块,如下所示

public Cursor runQuery(CharSequence constraint) {
    try{
        return fetchDataByName(constraint.toString());
    }catch (SQLException e){
        e.printStackTrace();
    }
    return null;
}