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 ^^)