FTS3 SQLite базы данных запросов - PullRequest
2 голосов
/ 26 января 2012

Я хочу реализовать поиск в своем приложении, но если я хочу запросить, приложение принудительно закрывается с java.lang.NullPointerException.

Я знаю, это указывает на то, что что-то не инициализировано. Но я не могу понять, что.


Прежде всего, моя база данных:

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

и заполнено примерами:

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')");


Моя деятельность довольно проста, инициировать что угодно, поймать поисковый замысел и выполнить запрос.

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

Активность находится в режиме одиночного просмотра, и я использую этот метод для перехвата Intent и строки запроса: http://developer.android.com/guide/topics/search/search-dialog.html#LifeCycle


Теперь я использовал разные способы запроса:

Прежде всего, простой курсор:

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

принеси мне ФК.

попробовал другой:

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

и получите ФК тоже.

Я не сохранил трассировку стека, но напоминаю, что трассировки всегда показывают мне код, где мой запрос возвращается и выполняется. Что я делаю не так?


StackTrace:

01-25 22: 02: 20.324: E / AndroidRuntime (5025): ФАТАЛЬНОЕ ИСКЛЮЧЕНИЕ: main
01-25 22: 02: 20.324: E / AndroidRuntime (5025): java.lang.RuntimeException: невозможно запустить действие
ComponentInfo {de.arvidg.onlineradio / de.arvidg.onlineradio.SearchActivity}: java.lang.NullPointerException 01-25 22: 02: 20.324: E / AndroidRuntime (5025): в android.app.ActivityThread.performLaunchActivity (ActivityThread.java:1956)
01-25 22: 02: 20.324: E / AndroidRuntime (5025): в android.app.ActivityThread.handleLaunchActivity (ActivityThread.java:1981)
01-25 22: 02: 20.324: E / AndroidRuntime (5025): в android.app.ActivityThread.access $ 600 (ActivityThread.java:123)
01-25 22: 02: 20.324: E / AndroidRuntime (5025): в android.app.ActivityThread $ H.handleMessage (ActivityThread.java:1147)
01-25 22: 02: 20.324: E / AndroidRuntime (5025): в android.os.Handler.dispatchMessage (Handler.java:99)
01-25 22: 02: 20.324: E / AndroidRuntime (5025): в android.os.Looper.loop (Looper.java:137)
01-25 22: 02: 20.324: E / AndroidRuntime (5025): в android.app.ActivityThread.main (ActivityThread.java:4424)
01-25 22: 02: 20.324: E / AndroidRuntime (5025): в java.lang.reflect.Method.invokeNative (родной метод)
01-25 22: 02: 20.324: E / AndroidRuntime (5025): в java.lang.reflect.Method.invoke (Method.java:511)
01-25 22: 02: 20.324: E / AndroidRuntime (5025): в com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java:784)
01-25 22: 02: 20.324: E / AndroidRuntime (5025): в com.android.internal.os.ZygoteInit.main (ZygoteInit.java:551)
01-25 22: 02: 20.324: E / AndroidRuntime (5025): в dalvik.system.NativeStart.main (собственный метод)
01-25 22: 02: 20.324: E / AndroidRuntime (5025): вызвано: java.lang.NullPointerException
01-25 22: 02: 20.324: E / AndroidRuntime (5025): в de.arvidg.test.SearchActivity.sampleQuery (SearchActivity.java:81)
01-25 22: 02: 20.324: E / AndroidRuntime (5025): в de.arvidg.test.SearchActivity.doSearch (SearchActivity.java:76)
01-25 22: 02: 20.324: E / AndroidRuntime (5025): в de.arvidg.test.SearchActivity.handleIntent (SearchActivity.java:62)
01-25 22: 02: 20.324: E / AndroidRuntime (5025): в de.arvidg.test.SearchActivity.onCreate (SearchActivity.java:37)
01-25 22: 02: 20.324: E / AndroidRuntime (5025): в android.app.Activity.performCreate (Activity.java:4465)
01-25 22: 02: 20.324: E / AndroidRuntime (5025): в android.app.Instrumentation.callActivityOnCreate (Instrumentation.java:1049)
01-25 22: 02: 20.324: E / AndroidRuntime (5025): в android.app.ActivityThread.performLaunchActivity (ActivityThread.java:1920)
01-25 22: 02: 20.324: E / AndroidRuntime (5025): ... еще 11

Строка 81:

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

другая строка возвращается только от намерения к строке 81 (значит, ничего особенного там нет ^^)

1 Ответ

0 голосов
/ 26 января 2012

Решено! База данных была неверна.

Это было в методе onCreate. Добавил его в мой метод поиска, решил это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...