Динамический спиннер с использованием базы данных SQLite - PullRequest
0 голосов
/ 22 декабря 2010

Мне удалось успешно связать два счетчика с базой данных с помощью SimpleCursorAdapter.Но мне нужно сделать выбор второго счетчика зависимым от выбора первого счетчика.

Вот как я связал данные:

    public class epa_estimates_button extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);
    setContentView(R.layout.epa_estimates);
    final Cursor cYear;
    final Cursor cMake;
    final Spinner mMakeSpinner;
    final Spinner mModelSpinner;
    cYear = (Cursor) DataBaseHelper.getEPADataYear();
    this.startManagingCursor(cYear);

    SimpleCursorAdapter scaYear = new SimpleCursorAdapter(this, R.layout.spinner_layout,cYear,new String[] {DataBaseHelper.EPA_COLUMN_ONE},new int[]{R.id.text1});
    scaYear.setDropDownViewResource(R.layout.spinner_dropdown);
    mYearSpinner = (Spinner) findViewById(R.id.yearSpinner);
    mYearSpinner.setAdapter(scaYear);

    cMake = (Cursor) DataBaseHelper.getEPADataMake();
    this.startManagingCursor(cMake);

    SimpleCursorAdapter scaMake = new SimpleCursorAdapter(this, R.layout.spinner_layout,cMake,new String[] {DataBaseHelper.EPA_COLUMN_TWO},new int[]{R.id.text1});
    scaMake.setDropDownViewResource(R.layout.spinner_dropdown);
    mMakeSpinner = (Spinner) findViewById(R.id.makeSpinner);
    mMakeSpinner.setAdapter(scaMake);
}}

Вот мой DataBaseHelper

    public class DataBaseHelper extends SQLiteOpenHelper {
private static String DB_PATH = "/data/data/org.application.ocdmpg/databases/";
private static String DB_NAME = "ocd_mpg.mp3";
private final int DB_VERSION = 1;
private static SQLiteDatabase myDataBase; 
private final Context myContext;
private static final String EPA_TABLE_NAME = "epa_data";
private static final String EPA_COLUMN_ID = "_id";
public DataBaseHelper(Context context) {

    super(context, DB_NAME, null, 1);
    this.myContext = context;
}
    public static Cursor getEPADataYear() 
{
    return myDataBase.query(EPA_TABLE_NAME, //table name
            new String[] {EPA_COLUMN_ID, EPA_COLUMN_ONE}, //list of columns to return
            null, //filter declaring which rows to return; formatted as SQL WHERE clause
            null,
            EPA_COLUMN_ONE, //filter declaring how to group rows; formatted as SQL GROUP BY clause
            null, //filter declaring which row groups to include in cursor; formatted as SQL HAVING clause
            null); //how to order rows; formatted as SQL ORDER BY clause
}
public static Cursor getEPADataMake() 
{
    return myDataBase.query(EPA_TABLE_NAME, new String[] {
            EPA_COLUMN_ID,
            EPA_COLUMN_TWO,
            }, 
            null, 
            null, 
            EPA_COLUMN_TWO, 
            null, 
            null);
}}

Я нашел код для setOnItemSelectedListener и попытался добавить свой код для привязки данных к счетчику, но метод startManagingCursor и конструкторы SimpleCursorAdapter выдают ошибку как неопределенную.Должен ли я использовать ArrayAdapter для заполнения моих счетчиков?Или есть способ исправить код ниже?

        mYearSpinner.setOnItemSelectedListener(new OnItemSelectedListener() {
        @Override
        public void onItemSelected(AdapterView<?> parentView, View selectedItemView, int position, long id) {
            // your code here
            cMake = (Cursor) DataBaseHelper.getEPADataMake();
            this.startManagingCursor(cMake);

            SimpleCursorAdapter scaMake = new SimpleCursorAdapter(this, R.layout.spinner_layout,cMake,new String[] {DataBaseHelper.EPA_COLUMN_TWO},new int[]{R.id.text1});
            scaMake.setDropDownViewResource(R.layout.spinner_dropdown);
            mMakeSpinner = (Spinner) findViewById(R.id.makeSpinner);
            mMakeSpinner.setAdapter(scaMake);
        }

        @Override
        public void onNothingSelected(AdapterView<?> parentView) {
            // your code here
        }

        });

1 Ответ

1 голос
/ 22 декабря 2010

Обновлено на основе ваших правок и комментариев

Ваш вызов на this.startManagingCursor(cMake) необходимо изменить на startManagingCursor(cMake) или epa_estimates_button.this.startManagingCursor(cMake), поскольку он выполняется изнутрикласс (OnItemSelectedListener).Он работает без 'this' (первый случай), потому что, в принципе, Java выясняет, какой this вы имели в виду.И это работает с именем класса, потому что это делает явным то, что Java вычислила бы для себя.Но безусловный this подразумевает, что вы ссылаетесь на внутренний класс this, и это не сработает.

Очень похоже, в вашем onItemSelectedListener ваш вызов startManagingCursor должен быть переписанas:

SimpleCursorAdapter scaMake = new SimpleCursorAdapter(epa_estimates_button.this,
    R.layout.spinner_layout,cMake,new String[] {DataBaseHelper.EPA_COLUMN_TWO},
    new int[]{R.id.text1});

(Я думаю, что ваши запросы к базе данных будут нуждаться в работе - вы, кажется, не используете какой-либо тип предложения WHERE, чтобы ограничить результаты 'make' соответствующим годом. Но еслиВы застряли на этом, пожалуйста, отправьте это как другой вопрос.)

...