2
votes

I want to implement a search in my application, but if I want to query the application force closes with a java.lang.NullPointerException.

I know it indicates, that something is not initialized. But I cant figure out what.


First of all, my Database:

db.execSQL("CREATE VIRTUAL TABLE " + TABLE_FTS 
+ " USING fts3(" + COL_ID + ", " + COL_KEY_NAME + ", "
+ COL_KEY_1+ " , " + COL_KEY_3 + ", " + COL_KEY_3 + " " + ");");

and filled with example sets:

db.execSQL("INSERT INTO " + TABLE_FTS + " (data1, data2, data3, data4) VALUES ('Test1', 'Test2', 'Test3', 'Test4')");
db.execSQL("INSERT INTO " + TABLE_FTS + " (data1, data2, data3, data4) VALUES ('Test1_2', 'Test2_2', 'Test3_2', 'Test4_2')");


My activity is rather simple, initiate anything, catch the search Intent and do the query.

DatabaseHelper helper = new DatabaseHelper(this);
database = helper.getWritableDatabase();

Activity is in singleTop mode and I use this method to catch Intent and query string: http://developer.android.com/guide/topics/search/search-dialog.html#LifeCycle


Now I used different query ways:

first of all, simple cursor:

public Cursor sampleQuery(String query) {
    tmp = "SELECT * FROM " + TABLE_FTS + " WHERE data1 MATCH '" + query + "'";
    return database.rawQuery(tmp, null);
}

get me an FC.

Tried another:

   public Cursor queryFTS(String query) {
        assert !TextUtils.isEmpty(query) : "query must not be an empty string!";

        return database.query(DatabaseHelper.TABLE_FTS,
                new String[] { DatabaseHelper.COL_KEY_NAME, DatabaseHelper.COL_KEY_WEBURL, DatabaseHelper.COL_KEY_STREAMURL, DatabaseHelper.COL_ID },
                DatabaseHelper.TABLE_FTS + " MATCH ?",
                new String[] { appendWildcard(query) },
                null, null, null);
    }

    private String appendWildcard(String query) {
        if (TextUtils.isEmpty(query)) return query;

        final StringBuilder builder = new StringBuilder();
        final String[] splits = TextUtils.split(query, " ");

        for (String split : splits)
          builder.append(split).append("*").append(" ");

        return builder.toString().trim();
    }

and get an FC, too.

I don't saved the stacktrace, but I remind me, the traces are alway show me the code where my query get returned and executed. Which does I do wrong?


Stacktrace:

01-25 22:02:20.324: E/AndroidRuntime(5025): FATAL EXCEPTION: main
01-25 22:02:20.324: E/AndroidRuntime(5025): java.lang.RuntimeException: Unable to start activity
ComponentInfo{de.arvidg.onlineradio/de.arvidg.onlineradio.SearchActivity}: java.lang.NullPointerException 01-25 22:02:20.324: E/AndroidRuntime(5025): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1956)
01-25 22:02:20.324: E/AndroidRuntime(5025): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1981)
01-25 22:02:20.324: E/AndroidRuntime(5025): at android.app.ActivityThread.access$600(ActivityThread.java:123)
01-25 22:02:20.324: E/AndroidRuntime(5025): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1147)
01-25 22:02:20.324: E/AndroidRuntime(5025): at android.os.Handler.dispatchMessage(Handler.java:99)
01-25 22:02:20.324: E/AndroidRuntime(5025): at android.os.Looper.loop(Looper.java:137)
01-25 22:02:20.324: E/AndroidRuntime(5025): at android.app.ActivityThread.main(ActivityThread.java:4424)
01-25 22:02:20.324: E/AndroidRuntime(5025): at java.lang.reflect.Method.invokeNative(Native Method)
01-25 22:02:20.324: E/AndroidRuntime(5025): at java.lang.reflect.Method.invoke(Method.java:511)
01-25 22:02:20.324: E/AndroidRuntime(5025): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
01-25 22:02:20.324: E/AndroidRuntime(5025): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
01-25 22:02:20.324: E/AndroidRuntime(5025): at dalvik.system.NativeStart.main(Native Method)
01-25 22:02:20.324: E/AndroidRuntime(5025): Caused by: java.lang.NullPointerException
01-25 22:02:20.324: E/AndroidRuntime(5025): at de.arvidg.test.SearchActivity.sampleQuery(SearchActivity.java:81)
01-25 22:02:20.324: E/AndroidRuntime(5025): at de.arvidg.test.SearchActivity.doSearch(SearchActivity.java:76)
01-25 22:02:20.324: E/AndroidRuntime(5025): at de.arvidg.test.SearchActivity.handleIntent(SearchActivity.java:62)
01-25 22:02:20.324: E/AndroidRuntime(5025): at de.arvidg.test.SearchActivity.onCreate(SearchActivity.java:37)
01-25 22:02:20.324: E/AndroidRuntime(5025): at android.app.Activity.performCreate(Activity.java:4465)
01-25 22:02:20.324: E/AndroidRuntime(5025): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049)
01-25 22:02:20.324: E/AndroidRuntime(5025): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1920)
01-25 22:02:20.324: E/AndroidRuntime(5025): ... 11 more

Line 81:

public Cursor sampleQuery(String query) {
    String tmp = "SELECT * FROM " + DatabaseHelper.TABLE_FTS + " WHERE data1 MATCH '" + query + "'";
    return database.rawQuery(tmp, null); **<--- Line 81**
}

the other line are only backtracked from intent to line 81 (means, nothing special there ^^)

1
Stack trace and full code may help. It is hard predict from half information. But, my guess is 'database' in queries is null.kosa
Yup, stack traces are pretty much required when debugging FC:s.Jens
Thats exactly what I think, too. But why is it null? I initiated it correctly.Leandros

1 Answers

0
votes

Solved it! The Database was not initiatet correct.

It was in the onCreate Method. Added it to my search method solved it.