Как реализовать автозаполнение с помощью cursoradapter - PullRequest
4 голосов
/ 21 марта 2011

У меня есть база данных SQLite, содержащая 2 таблицы по 4000+ строк, каждая из которых используется для автозаполнения. Я видел очень простые примеры, которые используют массив строк для обеспечения автозаполнения, или они используют список контактов, чтобы сделать то же самое. Очевидно, что ничего из этого не работает в моем случае. Как использовать собственную базу данных SQLite с собственными данными автозаполнения для автозаполнения. Нужно ли создавать контент-провайдеров? Как? Пожалуйста, приведите несколько примеров, потому что я не смог их найти. Мне удалось переопределить SQLiteOpenHelper, чтобы скопировать базу данных из папки активов в папку / data / data / MY_PACKAGE / database / на Android. Я создал пользовательский CursorAdapter, который использует мой пользовательский SQLiteOpenHelper и возвращает курсор от runQueryOnBackgroundThread. Я получаю странные ошибки об отсутствии некоторого столбца _id. Я добавил столбец _id в мои таблицы. Я также не понимаю, что делает интерфейс Filterable и когда мои данные фильтруются. Какие методы / классы мне нужно переопределить? Спасибо.

1 Ответ

7 голосов
/ 28 марта 2011

Работает.

Вам нужен SQLiteOpenHelper из здесь .Вы в основном должны скопировать вашу базу данных в определенную папку из вашей папки активов.Затем вам понадобится специальный CursorAdapter, который использует ваш собственный SQLiteOpenHelper.

Вот метод onCreate для моей деятельности.


    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.search);

        KeywordsCursorAdapter kwadapter = new KeywordsCursorAdapter(this, null);

        txtKeyword = (AutoCompleteTextView)this.findViewById(R.id.txtKeyword);
        txtKeyword.setAdapter(kwadapter);
        txtCity = (AutoCompleteTextView)this.findViewById(R.id.txtCity);
        btnSearch = (Button)this.findViewById(R.id.btnSearch);
        btnSearch.setOnClickListener(this);
    }

Вот курсорный адаптер.Вы можете передать NULL для курсора при построении.


public class KeywordsCursorAdapter extends CursorAdapter {

    private Context context;

    public KeywordsCursorAdapter(Context context, Cursor c) {
        super(context, c);
        this.context = context;
    }

    //I store the autocomplete text view in a layout xml.
    @Override
    public View newView(Context context, Cursor cursor, ViewGroup parent) {
        LayoutInflater inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        View v = inflater.inflate(R.layout.keyword_autocomplete, null);
        return v;
    }

    @Override
    public void bindView(View view, Context context, Cursor cursor) {
        String keyword = cursor.getString(cursor.getColumnIndex("keyword"));
        TextView tv = (TextView)view.findViewById(R.id.txtAutocomplete);
        tv.setText(keyword);
    }

    //you need to override this to return the string value when
    //selecting an item from the autocomplete suggestions
    //just do cursor.getstring(whatevercolumn);
    @Override
    public CharSequence convertToString(Cursor cursor) {
        //return super.convertToString(cursor);
        String value = "";
        switch (type) {
        case Keywords:
            value = cursor.getString(DatabaseHelper.KEYWORD_COLUMN);
            break;
        case Cities:
            value = cursor.getString(DatabaseHelper.CITY_COLUMN);
            break;
        }
        return value;
    }

    @Override
    public Cursor runQueryOnBackgroundThread(CharSequence constraint) {
        //return super.runQueryOnBackgroundThread(constraint);
        String filter = "";
        if (constraint == null) filter = "";
        else
            filter = constraint.toString();
                //I have 2 DB-s and the one I use depends on user preference
        SharedPreferences prefs  = PreferenceManager.getDefaultSharedPreferences(context);
        //String selectedCountryCode = prefs.getString("selectedCountry", "GB");
        String selectedCountryCode = prefs.getString(context.getString(R.string.settings_selected_country), "GB");
        selectedCountryCode += "";

                //Here i have a static SQLiteOpenHelper instance that returns a cursor.
        Cursor cursor = MyApplication.getDbHelpers().get(selectedCountryCode.toLowerCase()).getKeywordsCursor(filter);
        return cursor;
    }
}

Вот часть, которая возвращает курсор: это просто выделение с подобным условием.


public class DatabaseHelper extends SQLiteOpenHelper {

...

    public synchronized Cursor getKeywordsCursor (String prefix) {
        if (database == null) database = this.getReadableDatabase();
        String[] columns = {"_id", "keyword"};
        String[] args = {prefix};

        Cursor cursor;
        cursor = database.query("keywords", columns, "keyword like '' || ? || '%'", args, null, null, "keyword", "40");

        int idcol = cursor.getColumnIndexOrThrow("_id");
        int kwcol = cursor.getColumnIndexOrThrow("keyword");

        while(cursor.moveToNext()) {
            int id = cursor.getInt(idcol);
            String kw = cursor.getString(kwcol);
            Log.i("keyword", kw);
        }

        cursor.moveToPosition(-1);
        return cursor;
    }

...

}

Вы также можете создатьпользовательский контент-провайдер, но в этом случае это будет просто еще один бесполезный класс, который нужно переопределить.

...