SQLite
 sql >> Database >  >> RDS >> SQLite

Come posso aggiornare un campo del mio spinner con l'input dell'utente in EditText

Il tuo problema è che stai usando la posizione selezionata dello Spinner (0,1,2 ecc.) Come ID della riga. L'ID della prima riga sarà 1, quindi 2, ecc. (probabilmente ma NON CERTAMENTE, ovvero elimina una riga per qualche motivo e hai uno spazio vuoto nella sequenza ).

Pertanto, ciò che stai riscontrando attualmente è una differenza di 1 tra l'ID riga e la posizione dello spinner, quindi non viene aggiornato nulla o un'altra riga.

È necessario utilizzare un metodo per calcolare l'id di riga nella posizione dello spinner (ad esempio un secondo array che ha il rispettivo ID per lo stesso indice del primo array) o, quello che farei è, sfruttare il flessibilità di un CursorAdpater , come SimpleCursorAdapter e quindi usa spinner.getSelectedItemId() invece di spinner.getSelectedItemPosition() .

Per utilizzare A CursorAdapter, avrai bisogno di una riga chiamata _id (es. modifica private static final String KEY_ID = "id"; a public static final String KEY_ID = "_id"; )

Nota! Suggerirei anche di modificare, come ho fatto sopra, le tue private statics a public statics ).

Inoltre, per utilizzare un CursorAdapter, avrai bisogno di un Cursor. Il metodo seguente in SpinnerDatabase.java sarebbe sufficiente.

public Cursor getAll() {
    db = this.getWritableDatabase();
    return db.query(TABLE_LABELS,null,null,null,null,null,null);
}

Per configurare l'adattatore è possibile utilizzare quanto segue:-

    csr = dbhlpr.getAll();

    sca = new SimpleCursorAdapter(this,
            android.R.layout.simple_list_item_1,
            csr,
            new String[]{SpinnerDatabase.KEY_NAME},
            new int[]{android.R.id.text1},0);

    spinner.setAdapter(sca);

Nota! l'uso di SpinnerDatabase.KEY_NAME , questo è un esempio del motivo per cui suggerisco "statico pubblico" anziché private static .

Ci sono sottili differenze per SimpleCursorAdpater;

  • parametro è il Cursore,
  • è un array String dei nomi delle colonne nel cursore da visualizzare (dovrebbe corrispondere al 5° parametro),
  • è l'ID delle viste in cui vengono inseriti i dati (per simple_list_item_1 usa 1 nome di colonna insieme ad android.R.id.text1 come sopra) .

e quando si tratta dell'aggiornamento usa spinner.getSelectedItemId() per l'ID riga.

Esempio di lavoro (suppone che le righe contengano dati)

SpinnerDatabase.java

public class SpinnerDatabase extends SQLiteOpenHelper {
    private SQLiteDatabase db;

    private static final int DATABASE_VERSION = 1;
    private static final String DATABASE_NAME = "spinnerDB";
    private static final String TABLE_LABELS = "labels";
    private static final String KEY_ID = "_id";
    public static final String KEY_NAME = "name";

    public SpinnerDatabase(Context context) {
        super(context,DATABASE_NAME,null,DATABASE_VERSION);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        String CREATE_CATEGORIES_TABLES = "CREATE TABLE " +
                TABLE_LABELS + "(" + KEY_ID + " INTEGER PRIMARY KEY AUTOINCREMENT,"+
                KEY_NAME + " TEXT)";
        db.execSQL(CREATE_CATEGORIES_TABLES);

    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        db.execSQL("DROP TABLE IF EXISTS " + TABLE_LABELS);
        onCreate(db);
    }

    public void insertLabel(String label){
        SQLiteDatabase db = this.getWritableDatabase();

        ContentValues values = new ContentValues();
        values.put(KEY_NAME,label);

        db.insert(TABLE_LABELS,null,values);
    }


    //Defunct
    public List<String> getAllLabels(){
        List<String> labels = new ArrayList<String>();
        String selectQuery = "SELECT * FROM "+ TABLE_LABELS;
        SQLiteDatabase db = this.getReadableDatabase();
        Cursor cursor = db.rawQuery(selectQuery,null);
        if (cursor.moveToFirst()){
            do{
                labels.add(cursor.getString(1));
            }while (cursor.moveToNext());
        }

        cursor.close();
        return labels;
    }


    public void updateSpinner (long id, String label){
        ContentValues values;
        String where;

        db = this.getWritableDatabase();

        where = KEY_ID + " = " +id;

        values = new ContentValues();
        values.put(KEY_NAME,label);

        db.update(TABLE_LABELS,values,where,null);
        db.close();
    }

    public Cursor getAll() {
        db = this.getWritableDatabase();
        return db.query(TABLE_LABELS,null,null,null,null,null,null);
    }
}

Attività SO46330096Activity.java

public class SO46330096Activity extends AppCompatActivity {

    SpinnerDatabase dbhlpr;
    Spinner spinner;
    Button editbutton;
    EditText spinneritem;
    SimpleCursorAdapter sca;
    Cursor csr;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_so46330096);
        spinner = (Spinner) findViewById(R.id.spinner);
        editbutton = (Button) findViewById(R.id.editbutton);
        spinneritem = (EditText) findViewById(R.id.spinnerinput);
        dbhlpr = new SpinnerDatabase(this);
        csr = dbhlpr.getAll();

        sca = new SimpleCursorAdapter(this,
                android.R.layout.simple_list_item_1,
                csr,
                new String[]{SpinnerDatabase.KEY_NAME},
                new int[]{android.R.id.text1},0);
        spinner.setAdapter(sca);

        editbutton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if (spinneritem.getText().toString().length() > 0) {
                    dbhlpr.updateSpinner(spinner.getSelectedItemId(),spinneritem.getText().toString());
                    sca.swapCursor(csr = dbhlpr.getAll());
                }
            }
        });

    }
}

Il layout activity_so46330096.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent">
    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="SO463300096 Activity"/>
    <LinearLayout
        android:orientation="horizontal"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
        <TextView
            android:layout_width="0dp"
            android:layout_weight="1"
            android:layout_height="match_parent"
            android:text="SPINNER ENTRY"
            />
        <EditText
            android:id="@+id/spinnerinput"
            android:layout_width="0dp"
            android:layout_weight="3"
            android:layout_height="match_parent" />
        <Button
            android:id="@+id/editbutton"
            android:layout_width="0dp"
            android:layout_weight="1"
            android:layout_height="match_parent"
            android:text="EDIT"/>
    </LinearLayout>
    <Spinner
        android:id="@+id/spinner"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content">
    </Spinner>
</LinearLayout>

Esempio di utilizzo:-

Selezionatore selezionato (i dati di aggiornamento della nota sono già stati inseriti ):-

Burro di arachidi selezionato e dati aggiornati inseriti :-

Dopo aver fatto clic sul pulsante Modifica:-

Impostazione di EditText sull'elemento Spinner attualmente selezionato

Quanto segue può essere utilizzato per impostare EditText sul valore dell'elemento di selezione correntemente selezionato:-

    spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
        @Override
        public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) {
            spinneritem.setText(csr.getString(csr.getColumnIndex(SpinnerDatabase.KEY_NAME)));
        }

        @Override
        public void onNothingSelected(AdapterView<?> adapterView) {

        }
    });

Potrebbe essere aggiunto dopo aver impostato l'adattatore nell'attività.

In SO46330096Activity.java sopra potrebbe seguire la linea :-

        spinner.setAdapter(sca);