1

When I try to execute a search, I am getting a NullPointerException in the log. I am trying to match the query you get from the search to the contacts names in my database using both query() and getContactMatches() methods. The log seems to be pointing to the code within these methods. Since the query() method is being used within getContactMatches(), I think the error originates from query(), but I have no idea.

Some code from database class:

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;
        }

Code from search activity class:

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);
        }
    });
}

Log:

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)
A--C
  • 36,351
  • 10
  • 106
  • 92

1 Answers1

0

It seems you never actually instantiate the reference variable DBHelper. This means that although it is global, it is still null. Somewhere, you're going to need to instantiate it. If DbHelper's constructor also needs a Context passed, in DatabaseTable's constructor you can do this:

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

Otherwise, just do DBHelper = new DbHelper ();

A--C
  • 36,351
  • 10
  • 106
  • 92
  • @user1930452 This answer, along with Sam's answer http://stackoverflow.com/questions/14044558/sql-android-error-no-such-table have helped you,you have written it yourself. The least you can do is accept our answers (check the hollowed out checkmark besides our answer). – A--C Dec 28 '12 at 04:42