morristech
1/3/2019 - 9:38 PM

Code snippets for adding FTS support to Room (Android architecture components)

Code snippets for adding FTS support to Room (Android architecture components)

@Database(entities = {
    Entry.class, Sense.class, CrossReference.class, EntryFts.class
}, version = 4, exportSchema = false) public abstract class AppDatabase extends RoomDatabase
public LiveData<PagedList<SearchResultEntry>> search(String term) {
  String wildcardQuery = String.format("*%s*", term);
  return new LivePagedListBuilder<>(entryDao.searchByJapaneseTerm(wildcardQuery), PAGE_SIZE).build();
}
@Transaction @Query(
      "SELECT entries.id, entries.primary_kanji, entries.primary_reading FROM entries "
          + "JOIN entriesFts ON (entries.id = entriesFts.docid) WHERE entriesFts MATCH :term")
  DataSource.Factory<Integer, SearchResultEntry> searchByJapaneseTerm(String term);
@Fts4(contentEntity = Entry.class)
@Entity(tableName = "entriesFts")
public class EntryFts {
  @ColumnInfo(name = "primary_kanji")
  private String primaryKanji;

  @NonNull
  @ColumnInfo(name = "primary_reading")
  private String primaryReading;

  @ColumnInfo(name = "other_kanji")
  private String otherKanji;

  @ColumnInfo(name = "other_readings")
  private String otherReadings;

  public EntryFts(String primaryKanji, @NonNull String primaryReading, String otherKanji,
      String otherReadings) {
    this.primaryKanji = primaryKanji;
    this.primaryReading = primaryReading;
    this.otherKanji = otherKanji;
    this.otherReadings = otherReadings;
  }

  public String getPrimaryKanji() {
    return primaryKanji;
  }

  @NonNull public String getPrimaryReading() {
    return primaryReading;
  }

  public String getOtherKanji() {
    return otherKanji;
  }

  public String getOtherReadings() {
    return otherReadings;
  }
}
Room.databaseBuilder(...)
.addMigrations(new Migration(3, 4) {
  @Override public void migrate(@NonNull SupportSQLiteDatabase database) {
    database.execSQL("CREATE VIRTUAL TABLE IF NOT EXISTS `entriesFts` USING FTS4(`primary_kanji`, `primary_reading`, `other_kanji`, `other_readings`, content=`entries`)");
    database.execSQL("INSERT INTO entriesFts(entriesFts) VALUES ('rebuild')");
  }
})
.build();