2017-11-29 7 views
1

기존 Sqlite에서 Room으로 기존 응용 프로그램을 마이그레이션하는 방법을 찾고 있었고 FTS를 사용하는 부분을 어떻게 마이그레이션 할 수 있는지 찾을 수 없었습니다.방으로 마이그레이션 : 전체 텍스트 검색을 수행하는 방법?

private static final String CREATE_VIRTUAL_TABLE = "CREATE VIRTUAL TABLE " + FTS_VIRTUAL_TABLE + 
      " using fts4 (content='" + TABLE_NOTIFICATION + "', " + COLUMN_TITLE + ")"; 

private static void createVirtualTriggers(SQLiteDatabase database){ 
     database.execSQL("CREATE TRIGGER virtual_bu BEFORE UPDATE ON " + TABLE_NOTIFICATION + " BEGIN\n" + " DELETE FROM " + FTS_VIRTUAL_TABLE + " WHERE docid=old.rowid;\n" + "END;"); 
     database.execSQL("CREATE TRIGGER virtual_bd BEFORE DELETE ON " + TABLE_NOTIFICATION + " BEGIN\n" + " DELETE FROM " + FTS_VIRTUAL_TABLE + " WHERE docid=old.rowid;\n" + "END;"); 
     database.execSQL("CREATE TRIGGER virtual_au AFTER UPDATE ON " + TABLE_NOTIFICATION + " BEGIN\n" + " INSERT INTO " + FTS_VIRTUAL_TABLE + "(docid, " + COLUMN_TITLE + ") VALUES(new.rowid, new." + COLUMN_TITLE +");\n" + "END;"); 
     database.execSQL("CREATE TRIGGER virtual_ai AFTER INSERT ON " + TABLE_NOTIFICATION + " BEGIN\n" + " INSERT INTO " + FTS_VIRTUAL_TABLE + "(docid, " + COLUMN_TITLE + ") VALUES(new.rowid, new." + COLUMN_TITLE +");\n" +     "END;"); 
    } 

룸이 동일한 기능을 달성하기 위해 어떤 방법이 있나요 :

는 지금, 나는 트리거에 의해 행이 삽입되거나 업데이트 될 때마다 채워져 가상 테이블이?

답변

2

아니요. 이 요청을 추적중인 this issuethis issue을 참조하십시오.

질문에서 코드 조각의 테이블 및 트리거를 만들 때 calling getOpenHelper() on the RoomDatabase으로 작성하고 SQLiteOpenHelper과 비슷한 방법으로 FTS 시나리오에서 데이터베이스를 직접 작업 할 수 있습니다. 방은 새로운 테이블과 물건을 무시합니다. 따라서 FTS 작업이 나머지 데이터베이스 작업과 상당히 다른 경우 FTS 작업을 수행 할 수 있습니다.

+0

죄송 합니다만, 나는이 부분을 얻지 못합니다. "그렇다면 FTS 작업이 나머지 데이터베이스 작업과 상당히 분리되어 있다면 그 경로로 갈 수있을 것입니다." FTS는 검색 가능한 구성 요소를 사용하여 테이블 중 하나를 검색하기위한 것입니다. 또한 간단한 예제를 통해 좀 더 자세히 설명 할 수 있습니까? – Eylen

+1

@Eylen : Room에서'@ Entity'를 통해 만든 테이블은 적어도 Room 1.0.0을 통해 FTS를 가질 수 없습니다 (질문과 연결된 문제 참조). CREATE TABLE 문을 통해 생성 된 테이블은 FTS를 가질 수 있지만, Room은 그것에 대해 아무것도 모릅니다. 따라서 FTS를 인식하기 위해 Room이 필요한 경우이 방법은 효과가 없습니다. [이 샘플 애플리케이션] (https://github.com/commonsguy/cw-androidarch/tree/v0.6/CityPop/RoomPragma)은'getOpenHelper()'를 사용하여이 경우 PRAGMA 문을 실행하는 방법을 보여줍니다. 그렇게 직접 테이블을 정의 할 수 있습니다. AFAIK. – CommonsWare

+0

그래서 ... @ Entity로 내 테이블을 만들고 getOpenHelper()로 RoomDatabase에 가상 테이블과 트리거를 만들 수 있습니까? 또는 "메인"테이블이 수동으로 생성되지 않기 때문에 작동하지 않습니까? – Eylen