Android 尝试将数据与搜索中的查询进行匹配时出现NullPointerException
当我尝试执行搜索时,我在日志中得到一个NullPointerException。我正在尝试使用query()和getContactMatches()方法将从搜索中获得的查询与数据库中的联系人姓名进行匹配。日志似乎指向这些方法中的代码。由于getContactMatches()中正在使用query()方法,我认为错误源于query(),但我不知道 数据库类中的一些代码:Android 尝试将数据与搜索中的查询进行匹配时出现NullPointerException,android,search,nullpointerexception,Android,Search,Nullpointerexception,当我尝试执行搜索时,我在日志中得到一个NullPointerException。我正在尝试使用query()和getContactMatches()方法将从搜索中获得的查询与数据库中的联系人姓名进行匹配。日志似乎指向这些方法中的代码。由于getContactMatches()中正在使用query()方法,我认为错误源于query(),但我不知道 数据库类中的一些代码: public Cursor getContactMatches(String query, String[] columns)
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);
}
});
}
似乎您从未实际实例化引用变量
DBHelper
。这意味着,尽管它是全局的,但仍然是null。在某些地方,您需要实例化它。如果DbHelper的构造函数也需要传递上下文
,则在数据库表
的构造函数中,可以执行以下操作:
public DataBaseTable (Context context)
{
DBHelper = new DbHelper (context);
//rest of your initialization stuff here.
}
否则,只需执行
DBHelper=newdbhelper()代码>数据库表的第99行是什么?请注意,您在哪里初始化DBHelper
?我在DatabaseTable类的顶部初始化了DBHelper:您在哪里初始化DBHelper=newdbhelper()
?你知道吗?这可能是您的问题;99行代码是:Cursor Cursor=build.query(DBHelper.getReadableDatabase,columns,selection,selectionArgs,null,null);所以你从来没有做过DBHelper=newdbhelper()
?这就是你得到NPE的原因。@user1930452这个答案,连同Sam的答案都对你有帮助,你自己写的。你至少可以接受我们的答案(在答案旁边勾选镂空的复选标记)。
public DataBaseTable (Context context)
{
DBHelper = new DbHelper (context);
//rest of your initialization stuff here.
}