【问题标题】:NullPointerException when trying to match data with query from search尝试将数据与搜索中的查询匹配时出现 NullPointerException
【发布时间】:2012-12-28 11:56:49
【问题描述】:

当我尝试执行搜索时,我在日志中收到 NullPointerException。我正在尝试使用 query() 和 getContactMatches() 方法将您从搜索中获得的查询与我的数据库中的联系人姓名相匹配。日志似乎指向这些方法中的代码。由于 getContactMatches() 中使用了 query() 方法,我认为错误源于 query(),但我不知道。

来自数据库类的一些代码:

public Cursor getContactMatches(String query, String[] columns) {
            String selection = COL_NAME + " MATCH ?";
            String[] selectionArgs = new String[] {query+"*"};

            return query(selection, selectionArgs, columns);
        }

private Cursor query(String selection, String[] selectionArgs, String[] columns) {
            SQLiteQueryBuilder build = new SQLiteQueryBuilder();
            build.setTables(DATABASE_TABLE);

            Cursor cursor = build.query(DBHelper.getReadableDatabase(),
                    columns, selection, selectionArgs, null, null, null);

            if (cursor == null) {
                return null;
            }

            return cursor;
        }

搜索活动类的代码:

public class SearchResultsActivity extends ListActivity {

private ListView list;
DatabaseTable db;
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_search_results);
    db = new DatabaseTable(this);
    handleIntent(getIntent());
}

public void onNewIntent(Intent intent) {
    setIntent(intent);
    handleIntent(intent);
}

private void handleIntent(Intent intent) {
    if (Intent.ACTION_VIEW.equals(intent.getAction())) {
        Intent contactIntent = new Intent(this, ContactActivity.class);
        contactIntent.setData(intent.getData());
        startActivity(contactIntent);
        finish();
    } else if (Intent.ACTION_SEARCH.equals(intent.getAction())) {
        String query = intent.getStringExtra(SearchManager.QUERY);
        showResults(query);
    }

}

private void showResults(String query) {
    int name = 0;
    String c = "";
    Cursor cursor = db.getContactMatches(query, null);
    int cursor_length = db.cursorLength(cursor);
    String[] display = new String[cursor_length];
    list = (ListView)findViewById(android.R.id.list);
    int x = 0;

    //Loading data through Cursor into String array
    for (cursor.moveToFirst(); !cursor.isAfterLast(); cursor.moveToNext())
    {
        name = cursor.getColumnIndex(DatabaseTable.COL_NAME);
        c = (cursor.getString(name));
        display[x] = c;
        c = "";
        x = x + 1;
        name = 0;
    }

    ArrayAdapter<String> contactAdapter = new ArrayAdapter<String>(this,
              R.layout.activity_search_results, android.R.id.list, display);
    list.setAdapter(contactAdapter);
    list.setOnItemClickListener(new OnItemClickListener() {
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            Intent contactIntent = new Intent(getApplicationContext(), ContactActivity.class);
            contactIntent.setData(getIntent().getData());
            startActivity(contactIntent);
        }
    });
}

日志:

12-27 20:57:24.962: E/AndroidRuntime(635): FATAL EXCEPTION: main
12-27 20:57:24.962: E/AndroidRuntime(635): java.lang.NullPointerException
12-27 20:57:24.962: E/AndroidRuntime(635):  at com.example.myfirstapp.DatabaseTable.query(DatabaseTable.java:99)
12-27 20:57:24.962: E/AndroidRuntime(635):  at com.example.myfirstapp.DatabaseTable.getContactMatches(DatabaseTable.java:92)
12-27 20:57:24.962: E/AndroidRuntime(635):  at com.example.myfirstapp.SearchResultsActivity.showResults(SearchResultsActivity.java:51)
12-27 20:57:24.962: E/AndroidRuntime(635):  at com.example.myfirstapp.SearchResultsActivity.handleIntent(SearchResultsActivity.java:43)

【问题讨论】:

  • DatabaseTable 的第 99 行是哪一行?在相关说明中,您在哪里初始化 DBHelper
  • 我在 DatabaseTable 类的顶部初始化了 DBHelper:
  • 你在哪里工作DBHelper = new DBHelper ()?你有吗?这可能是你的问题。
  • 私有 DbHelper DBHelper;第99行代码为:Cursor cursor = build.query(DBHelper.getReadableDatabase, columns, selection, selectionArgs, null, null, null);
  • 所以你从不做DBHelper = new DbHelper ()?这就是你获得 NPE 的原因。

标签: android search nullpointerexception


【解决方案1】:

您似乎从未真正实例化引用变量DBHelper。这意味着虽然它是全局的,但它仍然是null。在某个地方,您将需要实例化它。如果 DbHelper 的构造函数还需要一个 Context 传递,在 DatabaseTable 的构造函数中你可以这样做:

public DataBaseTable (Context context)
{
 DBHelper = new DbHelper (context);
 //rest of your initialization stuff here.
}

否则,就做DBHelper = new DbHelper ();

【讨论】:

  • @user1930452 这个答案以及山姆的答案stackoverflow.com/questions/14044558/… 帮助了你,你自己写的。您至少可以接受我们的答案(除了我们的答案外,请检查挖空的复选标记)。
猜你喜欢
  • 1970-01-01
  • 2016-09-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-20
  • 2017-05-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多