sql >> Base de Datos >  >> RDS >> SQLite

¿Cómo puedo actualizar un campo de mi spinner con la entrada del usuario en EditText?

Su problema es que está utilizando la posición seleccionada de Spinner (0,1,2, etc.) como la identificación de la fila. La identificación de la primera fila será 1, luego 2, etc. (probablemente, pero NO CON SEGURIDAD, es decir, elimine una fila por algún motivo y tendrá un espacio en la secuencia ).

Como tal, lo que está experimentando actualmente es una diferencia de 1 entre la identificación de la fila y la posición de la rueda giratoria, por lo que no se actualiza nada o se actualiza otra fila.

Debe emplear algún método para calcular la identificación de la fila en la posición de la ruleta (por ejemplo, una segunda matriz que tenga la identificación respectiva para el mismo índice de la primera matriz), o lo que yo haría es aprovechar el flexibilidad de un CursorAdpater , como SimpleCursorAdapter y luego use spinner.getSelectedItemId() en lugar de spinner.getSelectedItemPosition() .

Para usar A CursorAdapter, necesitará una fila llamada _id (por ejemplo, cambiar private static final String KEY_ID = "id"; a public static final String KEY_ID = "_id"; )

¡Nota! También sugeriría cambiar, como hice anteriormente, sus private statics a public statics ).

Además, para usar un CursorAdapter, necesitará un Cursor. El siguiente método en SpinnerDatabase.java sería suficiente.

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

Lo siguiente podría usarse para configurar el adaptador:-

    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! el uso de SpinnerDatabase.KEY_NAME , este es un ejemplo de por qué sugiero 'public static' en lugar de private static .

Hay diferencias sutiles para SimpleCursorAdpater;

  • el parámetro es el Cursor,
  • es una matriz de cadenas de los nombres de columna en el cursor que se mostrará (debe coincidir con el quinto parámetro),
  • quinto es el id de las vistas en las que se colocan los datos (para simple_list_item_1 use 1 nombre de columna junto con android.R.id.text1 como arriba) .

y cuando se trata de la actualización, use spinner.getSelectedItemId() para la identificación de la fila.

Ejemplo de trabajo (se supone que las filas tienen datos)

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);
    }
}

Actividad SO46330096Actividad.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());
                }
            }
        });

    }
}

El Diseño actividad_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>

Ejemplo de uso:-

Spinner seleccionado (tenga en cuenta que los datos de actualización ya se han ingresado ):-

Mantequilla de maní seleccionada y datos actualizados ingresados:-

Después de hacer clic en el botón Editar:-

Configurar EditText en el elemento giratorio actualmente seleccionado

Lo siguiente se puede usar para establecer EditText en el valor del elemento giratorio seleccionado actualmente:-

    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) {

        }
    });

Se podría agregar después de configurar el adaptador en la actividad.

En el anterior SO46330096Activity.java podría seguir la línea :-

        spinner.setAdapter(sca);