Получение идентификатора объекта, заполняющего Spinner - PullRequest
0 голосов
/ 11 мая 2018

Вопрос простой, но я не смог найти никакого решения. У меня есть таблица SQLite с "id" и "name" в качестве столбцов. Мне нужно было показать в счетчике только имя (я это сделал), но я хочу получить идентификатор объекта, который отображается в счетчике только по имени. Есть ли способ сделать это?

DatabaseHelper.java

@Override
public void onCreate(SQLiteDatabase db) {
    String createTable = "CREATE TABLE " + TABLE_NAME + " ( " + COL1 + "       INTEGER PRIMARY KEY AUTOINCREMENT, " +
            COL2 + " TEXT);";

db.execSQL(createTable);
}
public boolean addData(String item) {
    SQLiteDatabase db = this.getWritableDatabase();
    ContentValues contentValues = new ContentValues();
    contentValues.put(COL2, item);

    Log.d(Tag, "addData: Adding " + item + " to " + TABLE_NAME);
    long result = db.insert(TABLE_NAME, null, contentValues);

    if (result == -1) {
        return false;
    } else {

        return true;
    }
}

public List<String> getAllLabels(){
    List<String> labels = new ArrayList<String>();

    // Select All Query
    String selectQuery = "SELECT  * FROM " + TABLE_NAME;

    SQLiteDatabase db = this.getReadableDatabase();
    Cursor cursor = db.rawQuery(selectQuery, null);

    // looping through all rows and adding to list
    if (cursor.moveToFirst()) {
        do {
            labels.add(cursor.getString(1));
        } while (cursor.moveToNext());
    }

    // closing connection
    cursor.close();
    db.close();

    // returning lables
    return labels;
}

mainactivity.java

public void AddData(String newEntry){
    boolean insertData = mDatabaseHelper.addData(newEntry);

    if (insertData){
        toastMessage("Data Succesfully entered");
    } else {
        toastMessage("Oops! Something went wrong");
    }

    loadSpinnerData();

}

    private void loadSpinnerData() {
    // database handler
    DatabaseHelper db = new DatabaseHelper(getApplicationContext());

    // Spinner Drop down elements
    List<String> lables = db.getAllLabels();

    // Creating adapter for spinner
    ArrayAdapter<String> dataAdapter = new ArrayAdapter<String>(this,
            android.R.layout.simple_spinner_item, lables);

    // Drop down layout style - list view with radio button
    dataAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);

    // attaching data adapter to spinner
    spinner.setAdapter(dataAdapter);
}

activity_main.xml

<Spinner
    android:id="@+id/spinner"
    android:layout_width="368dp"
    android:layout_height="29dp"
    android:layout_marginEnd="8dp"
    android:layout_marginLeft="8dp"
    android:layout_marginRight="8dp"
    android:layout_marginStart="8dp"
    android:layout_marginTop="8dp"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toBottomOf="@+id/editText" />

Код работает нормально, я скопировал то, что мне кажется необходимым.

1 Ответ

0 голосов
/ 12 мая 2018

У вас есть несколько вариантов.

Вы можете определить идентификатор на основе метки, НО, только если метка уникальна, добавив новый метод, скажем getLabelId например,

public long getLabelId(String label) {
    long rv = -1; //<<<< default return if nothing found
    SQLiteDatabase db = this.getWritableDatabase();
    String whereclause = "your_label_column_name" + "=?";
    String[] whereargs = new String[]{label};
    Cursor cursor = db.query(TABLE_NAME,null,whereclause,whereargs,null,null,null);
    if (cursor.moveToFirst) {
        rv = cursor.getLong(csr.getColumnIndex("your_id_column");
    }
    cursor.close();
    return rv;
}

- очевидно, вам придется изменить_ _ к соответствующим значениям.

Вы можете создать бесплатный массив, содержащий идентификатор, чтобы n-й элемент дополнительного массива содержал идентификатор для n-го элемента списка, возвращенного из getAllLabels method.

Вы можете создать класс, скажем, Label, который имеет члены для метки и идентификатора, и использовать его в качестве источника Spinner.

Или вы можете использовать CursorAdapter вместоArrayAdapter.

Чтобы использовать последний, вам нужно будет только вернуть курсор из метода getAllLabels.например: -

public Cursor getAllLabels(){

    // Select All Query
    String selectQuery = "SELECT  * FROM " + TABLE_NAME;
    SQLiteDatabase db = this.getReadableDatabase();
    return db.rawQuery(selectQuery, null);
}
  • ПРИМЕЧАНИЕ !!! CursorAdapters требуют, чтобы столбец id имел имя _id(BaseColumns._ID можно использовать).Таким образом, чтобы использовать этот метод, вам нужно изменить имя идентификатора столбца на _id, если оно еще не названо.

вместе с: -

Cursor csr = getAllLabels();
SimpleCursorAdapter dataAdapter = new SimpleCursorAdapter(
    this,
    android.R.layout.simple_spinner_item,
    csr, //<<<< The Cursor to source the Spinner
    new String[]{"your_label_column_name"}, //<<<< The FROM Column(s)
    new int[]{android.R.id.text1}, //<<<< The respective TO View(s) to populate
    0 //<<<< see documentation but 0 will very likely suffice
);

в качестве замены: -

    // Spinner Drop down elements
    List<String> lables = db.getAllLabels();

    // Creating adapter for spinner
    ArrayAdapter<String> dataAdapter = new ArrayAdapter<String>(this,
        android.R.layout.simple_spinner_item, lables);

Метод Spinner onItemSelected получает 2 соответствующих значения в качестве 3-го и 4-го параметров / аргументов.3-е - позиция выбранного элемента, 4-е - идентификатор (если используется адаптер курсора).

...