Spinner с заполнением из базы данных

Рейтинг: 0Ответов: 1Опубликовано: 27.04.2015

Здравствуйте! Пытаюсь в spinner засунуть названия строчек из Базы данных, но надо сделать так, чтобы когда в базе данных добавлялись элементы - их тоже можна было выбрать. Вот как я это пробую делать (не добавляет ничего):

   int nameColIndex = c.getColumnIndex("name");
        //Формируете список операторов, которые будут в спинере
        spinner = (Spinner)findViewById(R.id.shablspin);
        ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
                android.R.layout.simple_spinner_item, nameColIndex);
        adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        spinner.setAdapter(adapter);


        c.close();
        dbHelper.close();
    }

DBHelper.class

public class DBHelper extends SQLiteOpenHelper {
    //----------------------------------------------------------------------------------------------
        String LOG_TAG = "myLogs";

        public DBHelper(Context context) {
            // конструктор суперкласса
            super(context, "myDB", null, 1);
        }

        @Override
        public void onCreate(SQLiteDatabase db) {
            Log.d(LOG_TAG, "--- onCreate database ---");
            // создаем таблицу с полями
            db.execSQL("create table mytable ("
                    + "id integer primary key autoincrement,"
                    + "name text,"
                    + "ip1 text,"
                    + "socket1 text,"
                    + "ip2 text,"
                    + "socket2 text,"
                    + "apn text,"
                    + "gprs text" + ");");
        }

        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

        }
}

Ответы

▲ 3Принят

В первую очередь , раз вы собрались работать с БД , то логично использовать SimpleCursorAdapter или собственный на его основе ,который работает напрямую с курсором и не требует бессмысленной перегонки данных в какие то временные хранилища , вроде коллекции .

Далее , выборка из БД осуществляется следующим образом :

database = DBhelper.getReadableDatabase();
Cursor cursor = database.query("mytable", new String[]{"_id", "name"}, null, null, null, null, null);

где:
mytable - имя таблицы , из которой необходимо сделать выборку
name - поле (столбец) в таблице , из которого необходимо получить значения
_id - необходимо для корректной работы в адаптере , поле (столбец) должен присутствовать в таблице. Значение - ID записи

Далее мы передаем полученный курсор в адаптер и привязываем его к спиннеру .

mSpinner = (Spinner)findViewById(R.id.shablspin);
SimpleCursorAdapter adapter = new SimpleCursorAdapter(this, android.R.layout.simple_spinner_item, сursor, new String[] {"name"}, new int[] {android.R.id.text1});
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
mSpinner.setAdapter(adapter);

Для обновления данных в спиннере, необходимо заново сделать выборку из БД в курсор , чтобы получить актуальные данные , затем сделать adapter.notifyDataSetChanged()

Узнать больше о работе с БД вы можете из этой статьи , там же есть альтернативный вариант спиннера с заполнением из БД , использующий промежуточный массив.

Пример более правильной реализации этой задачи через CursorLoader , который управляет жизненным циклом курсора и загружает данные в фоне.