AutoCompleteTextView에서 FilterQueryProvider를 이용한 DB쿼리



AutoCompleteTextView는 EditText를 상속받아 구현한것으로 자동완성 기능을 제공한다. Adapter를 설정하여 EditText가 타이핑이 일어나면 쿼리된 데이터를 보여준다. 

이렇게 타이핑이 일어날때 DB에서 쿼리후 Adapter의 changeCursor()를 하곤 하는데 SimpleCursorAdapter의 <span “=””>FilterQueryProvider를 이용하면 좀 더 간단하게 사용할 수 있다. SimpleCursorAdapter는 내부적으로 EditText의 타이핑을 감지해서 쿼리가 필요한 상황과, 그 쿼리에서 출력해야 될 문자를 구현할 수 있도록 설정 할수 있는 메서드를 지원한다.

<span “=””>

아래의 setCursorToStringConverter()는 리스트에 표시될 문자열을 반환하는 것을 구현하면 되고, setFilterQueryProvider는 타이핑으로 문자열이 바뀌었을때 해당 데이터를 새롭게 불러온 Curor를 넘기면 된다. 

adapter.setCursorToStringConverter(new CursorToStringConverter() {
    public String convertToString(android.database.Cursor cursor) {
        final int columnIndex = cursor.getColumnIndexOrThrow("title");
        final String str = cursor.getString(columnIndex);
        return str;
    }
});

adapter.setFilterQueryProvider(new FilterQueryProvider() {
    public Cursor runQuery(CharSequence constraint) {
        Cursor cursor = mDb.getDbLists(constraint);
        return cursor;
    }
});

이렇게 메서드도 지원하며, SimpleCursorAdapter에서 implements를 통해서 FilterQueryProvider를 구현해서 사용해도 무관하다. 또한 <span “=””>FilterQueryProvider는 백그라운드를 통해서 쿼리가 실행되기 때문에 직접 changeCursor()를 써서 메인쓰레드 쿼리되는것 보다 성능면에서 훨씬 유리하다.

<span “=””>

<span “=””>