나는 안드로이드를 위해 개발 중입니다. http://sqlite.org/fts3.html 참조를 사용하고 있습니다. fts 테이블을 다음과 같이 만듭니다.
final String SQL_CREATE_TABLE_SEARCHABLE =
new StringBuilder("CREATE VIRTUAL TABLE ")
.append(SearchableEntry.TABLE_NAME)
.append(" USING fts4(")
.append(SearchableEntry.COLUMN_DOG_ID).append(", ")
.append(SearchableEntry.COLUMN_BREED).append(", ")
.append(SearchableEntry.COLUMN_CATEGORY).append(",")
.append(SearchableEntry.COLUMN_DOG_NAME).append(",")
.append(SearchableEntry.COLUMN_DOCUMENTATION)
.append(");").toString();
sqLiteDatabase.execSQL(SQL_CREATE_TABLE_SEARCHABLE);
COLUMN_DOG_ID는 실제로 텍스트입니다. 숫자가 아니라 문자열입니다. 어쨌든 나는 테이블을 만든 다음 데이터를 추가합니다. 아무 문제가없는 것 같습니다. 그러나 쿼리를 시도 할 때 항상 막 다른 골목에 도달했습니다. 예외가 발생합니다. 다음은 쿼리입니다.
private Cursor getSearchableByTokens(Uri uri, String[] projection) {
DogLog.d(TAG,"getSearchableByTokens with uri %s",uri);
String table = DogContractt.SearchableEntry.TABLE_NAME;
String selection = table + " MATCH ? ";
String queryText = DogContractt.SearchableEntry.getQueryTextFromUri(uri);
String[] selectionArgs = {queryText};
if (null == mOpenHelper) {
mOpenHelper = new DogsDBHelper(getContext());
}
SQLiteDatabase readableDB = mOpenHelper.getReadableDatabase();
Cursor cursor = readableDB.query(table, projection, selection, selectionArgs, null, null, null);
if (null != cursor) {
cursor.setNotificationUri(getContext().getContentResolver(), DogContractt.SearchableEntry.CONTENT_URI);
}
return cursor;
}
오류
FATAL EXCEPTION: main
Process: com.company.android, PID: 18696
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.company.android/com.company.android.activities.SearchableActivity}: java.lang.IllegalArgumentException: column '_id' does not exist
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3122)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3221)
at android.app.ActivityThread.access$1000(ActivityThread.java:198)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1676)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:145)
at android.app.ActivityThread.main(ActivityThread.java:6840)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1404)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1199)
Caused by: java.lang.IllegalArgumentException: column '_id' does not exist
at android.database.AbstractCursor.getColumnIndexOrThrow(AbstractCursor.java:303)
at android.database.CursorWrapper.getColumnIndexOrThrow(CursorWrapper.java:78)
at android.support.v4.widget.CursorAdapter.init(CursorAdapter.java:174)
at android.support.v4.widget.CursorAdapter.<init>(CursorAdapter.java:138)
at com.company.android.activities.SearchableActivity$2.<init>(SearchableActivity.java:0)
at com.company.android.activities.SearchableActivity.searchableResultsList(SearchableActivity.java:81)
at com.company.android.activities.SearchableActivity.searchContentProvider(SearchableActivity.java:73)
at com.company.android.activities.SearchableActivity.onCreate(SearchableActivity.java:59)
at android.app.Activity.performCreate(Activity.java:6535)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1120)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3075)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3221)
at android.app.ActivityThread.access$1000(ActivityThread.java:198)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1676)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:145)
at android.app.ActivityThread.main(ActivityThread.java:6840)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1404)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1199)
커서 어댑터에는이라는 고유 한 숫자 열이 필요합니다 _id
. 이는 FTS 테이블이든 일반 테이블이든 모든 쿼리 결과에 적용됩니다.
FTS 테이블에는 내부 docid
열이 있습니다 . 프로젝션에 추가하기 만하면됩니다.
String[] projection = new String[] { "docid AS _id", ... };
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다