FTS3 SQLite数据库查询

时间:2012-01-25 20:33:42

标签: java android database sqlite

我想在我的应用程序中实现搜索,但如果我想查询应用程序,请使用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')");


我的活动相当简单,启动任何东西,捕获搜索Intent并进行查询。

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

Activity处于singleTop模式,我使用此方法捕获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);
}

给我一个FC。

试了另一个:

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

并获得FC。

我没有保存堆栈跟踪,但我提醒我,跟踪总是向我显示我的查询返回并执行的代码。哪个我做错了?


堆栈跟踪:

  

01-25 22:02:20.324:E / AndroidRuntime(5025):致命异性:主要
  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):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):引起: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

第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 :(得分:0)

解决了!数据库并不是正确的。

是在onCreate方法中。添加到我的搜索方法解决了它。