AutoCompleteTextView를 자신의 sqlite와 연동해서 구현하고 싶다?
보통 simpleCursorAdapter를 구현하던지 하는데요..
상당히 난해합니다.
귀찮아서 편법을 써봤는데요. ArrayAdapter를 이용하는 방법입니다.
가령 자신의 디비에 몇 천건의 스트링 데이터가 들어있다 가정 하고... (가령 단어장 어플...)
디비에 있는 모든 데이터를 배열에 집어 넣고 ArrayAdapter를 만듭니다.
여기까진 상당히 쉽죠? 하지만 속도가 상당히 느리겠죠. 데이터가 많다면.. 메모리도 많이 차지하고요.
제 방식은요.. 일단 배열에 디비의 데이터를 가져오고 복사할 때
속도를 좀더 빠르게 하기 위해. 쿼리문을 응용합니다.
사용자가 AutoCompleteTextView에 입력을 할 경우 ( ex: ab 입력)
sqlite으로 쿼리를 날려줍니다. select * from my_table where title like '%ab%'
이제 막 개발 시작하는 초보 개발자분들 like 명령문이 보이시죠? 그리고 % 기호.
이 쿼리 문을 해석하자면 my_table 에서 title 어트리뷰트에서 ab 가 포함된 레코드를 셀렉트 하라..
이런 의미입니다.
가령 디비에 ab, aaaa, bcab 가 있다면 위 쿼리문으로 ab, bcab를 가져옵니다.
즉 ArrayAdapter를 만들기 위해 배열을 구성할 때, 디비의 모든 데이터를 가져오는 것이 아니라
sql문으로 한단계 필터링을 해서 가져옵니다. 배열에 집어 넣을 데이터 양이 줄겠죠??
(데이터가 정말 많다면, 사용자가 두단어 이상 입력했을 때 sql을 날리면 되겠죠. 아니면 사용자가 0.5초 입력을 멈추었을 때 보여주던지요~ 등등 )
다음은 실 사용 예입니다.
//TextWatcher는 텍스트 뷰에 입력이 있을 경우 작동합니다. searchBar는 AutoCompleteTextView
searchBar.addTextChangedListener(new TextWatcher() {
String[] strList;
@Override
public void afterTextChanged(Editable s) {
// TODO Auto-generated method stub
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count,
int after) {
// TODO Auto-generated method stub
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
String target = searchBar.getText().toString(); //searchBar에서 사용자가 입력한 단어를 가져옵니다.
if(target.length() < 2) return; // 입력한 단어가 1글자라면 퍼포먼스를 위해 디비를 검색하지 않습니다.
Cursor c = DatabaseFacadeChannel.getInstance().fetchWordsIncludeSubString(getDB(), target);
// 이 부분은 현재 AutoCompleteTextView 에 입력된 단어를 포함하는 데이터를 가져오는 부분인데, 각자 사정에 맞게구현하시면 되겠습니다. select * from my_table where title like '%target%' <== 요 녀석만 수행하면 되죠
//필터링해서 가져온 녀석들을 배열에 넣어주는 작업.
c.moveToFirst();
int max = c.getCount();
strList = new String[max]; for(int i =0; i < max; i++) {
strList[i] = c.getString(WordDatabaseAdapter.WORD_INDEX); // 배열에 집어 넣어 줍니다.
c.moveToNext();
}
c.close();
ArrayAdapter<String> simpleArrayAdapter = //어레이 어뎁터 구현해 봅시다.
new ArrayAdapter<String>(getApplicationContext(),
android.R.layout.simple_dropdown_item_1line,
strList);
searchBar.setAdapter(simpleArrayAdapter); //마지막으로 구현한 어뎁터를 AutoCompleteTextView에 연결.
}
});
여기까지인데요..
사실 매번 배열을 생성하고 복사하는 부분이 있어서 퍼포먼스에 크게 차이가 없을 것 같긴 한데 -0-;
디비에 너무 많은 데이터가 있고 이 데이터를 모두 가져와서 배열에 넣고 싶지 않을 때 사용하면 좋겠습니다.
사실 데이터가 정말 많다면 몇만건, 다른 방법을 이용하는게 좋겠어요. 커서 어뎁터를 구현한다던지..
제 방법은 CursorAdapter를 이용하지 않고 쉽게 구현하는 방법이라 생각하시면 되겠습니다.