SQLite
 sql >> Base de données >  >> RDS >> SQLite

Comment puis-je mettre à jour un champ de mon spinner avec une entrée utilisateur dans EditText

Votre problème est que vous utilisez la position sélectionnée du Spinner (0,1,2, etc.) comme identifiant de la ligne. L'identifiant de la première ligne sera 1, puis 2, etc. (probablement mais PAS CERTAINEMENT, c'est-à-dire que vous supprimez une ligne pour une raison quelconque et que vous avez un vide dans la séquence ).

En tant que tel, ce que vous rencontrez actuellement est une différence de 1 entre l'ID de ligne et la position du spinner, donc rien ou une autre ligne est mise à jour.

Vous devez soit utiliser une méthode pour déterminer l'ID de ligne à la position du spinner (par exemple, un deuxième tableau qui a l'ID respectif pour le même index du premier tableau), soit, ce que je ferais, profiter de la flexibilité d'un CursorAdpater , comme SimpleCursorAdapter puis utilisez spinner.getSelectedItemId() au lieu de spinner.getSelectedItemPosition() .

Pour utiliser A CursorAdapter, vous aurez besoin d'une ligne appelée _id (par exemple, changez private static final String KEY_ID = "id"; à public static final String KEY_ID = "_id"; )

Noter! Je suggérerais également de modifier, comme je l'ai fait ci-dessus, vos private statics à public statics ).

De plus, pour utiliser un CursorAdapter, vous aurez besoin d'un Cursor. La méthode suivante dans SpinnerDatabase.java suffirait.

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

Les éléments suivants peuvent être utilisés pour configurer l'adaptateur :-

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

Noter! l'utilisation de SpinnerDatabase.KEY_NAME , c'est un exemple de la raison pour laquelle je suggère 'public static' par opposition à private static .

Il existe des différences subtiles pour le SimpleCursorAdapter ;

  • 3ème paramètre est le curseur,
  • 4ème est un tableau de chaînes des noms de colonnes dans le curseur à afficher (devrait correspondre au 5ème paramètre),
  • 5ème est l'identifiant des vues dans lesquelles les données sont placées (pour simple_list_item_1 utiliser 1 nom de colonne avec android.R.id.text1 comme ci-dessus) .

et en ce qui concerne la mise à jour, utilisez spinner.getSelectedItemId() pour l'ID de ligne.

Exemple de travail (en supposant que les lignes contiennent des données)

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

Activité 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());
                }
            }
        });

    }
}

La mise en page 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>

Exemple d'utilisation :-

Spinner sélectionné (notez que les données de mise à jour ont déjà été saisies ):-

Beurre de cacahuète sélectionné et données mises à jour saisies :-

Après avoir cliqué sur le bouton Modifier :-

Définir EditText sur l'élément Spinner actuellement sélectionné

Ce qui suit peut être utilisé pour définir EditText sur la valeur de l'élément de spinner actuellement sélectionné :-

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

        }
    });

Le pourrait être ajouté après avoir défini l'adaptateur dans l'activité.

Dans le fichier ci-dessusSO46330096Activity.java ça pourrait suivre la ligne :-

        spinner.setAdapter(sca);