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를 이용하지 않고 쉽게 구현하는 방법이라 생각하시면 되겠습니다.