SQLite
 sql >> Datenbank >  >> RDS >> SQLite

Wie kann ich ein Feld meines Spinners mit Benutzereingaben in EditText aktualisieren

Ihr Problem ist, dass Sie die ausgewählte Position des Spinners (0,1,2 usw.) als ID der Zeile verwenden. Die erste Zeilen-ID ist 1, dann 2 usw. (wahrscheinlich, aber NICHT SICHER, d. h. aus irgendeinem Grund eine Zeile löschen und Sie haben eine Lücke in der Sequenz ).

Daher erleben Sie derzeit einen Unterschied von 1 zwischen Zeilen-ID und Spinner-Position, sodass entweder nichts oder eine andere Zeile aktualisiert wird.

Sie müssen entweder eine Methode anwenden, um die Zeilen-ID zur Spinner-Position zu ermitteln (z. B. ein zweites Array, das die entsprechende ID für denselben Index des ersten Arrays hat), oder, was ich tun würde, nutzen Sie die Flexibilität eines CursorAdpater , wie z. B. SimpleCursorAdapter und verwenden Sie dann spinner.getSelectedItemId() anstelle von spinner.getSelectedItemPosition() .

Um einen CursorAdapter zu verwenden, benötigen Sie eine Zeile namens _id (z. B. ändern private static final String KEY_ID = "id"; zu public static final String KEY_ID = "_id"; )

Notiz! Ich würde auch vorschlagen, wie oben beschrieben, Ihre private statics zu ändern zu public statics ).

Um einen CursorAdapter zu verwenden, benötigen Sie außerdem einen Cursor. Die folgende Methode in SpinnerDatabase.java würde ausreichen.

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

Folgendes könnte verwendet werden, um den Adapter einzurichten:-

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

Notiz! die Verwendung von SpinnerDatabase.KEY_NAME , dies ist ein Beispiel dafür, warum ich "öffentliche statische" anstelle von private static vorschlage .

Es gibt subtile Unterschiede für den SimpleCursorAdpater;

  • 3. Parameter ist der Cursor,
  • 4. ist ein String-Array der Spaltennamen im Cursor, die angezeigt werden sollen (sollte mit dem 5. Parameter übereinstimmen),
  • 5. ist die IDs der Ansichten, in denen die Daten platziert werden (für simple_list_item_1 verwenden Sie 1 Spaltennamen zusammen mit android.R.id.text1 wie oben) .

und wenn es um das Update geht, verwenden Sie spinner.getSelectedItemId() für die Zeilen-ID.

Arbeitsbeispiel (setzt voraus, dass Zeilen Daten enthalten)

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

Aktivität 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());
                }
            }
        });

    }
}

Das 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>

Beispielverwendung:-

Spinner ausgewählt (Beachten Sie, dass Aktualisierungsdaten bereits eingegeben wurden ):-

Erdnussbutter ausgewählt und aktualisierte Daten eingegeben:-

Nach dem Klicken auf die Schaltfläche Bearbeiten :-

EditText auf das aktuell ausgewählte Spinner-Element setzen

Folgendes kann verwendet werden, um den EditText auf den Wert des aktuell ausgewählten Spinner-Elements zu setzen:-

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

        }
    });

Sie können hinzugefügt werden, nachdem Sie den Adapter in der Aktivität festgelegt haben.

In der obigen SO46330096Activity.java es könnte der Zeile folgen:-

        spinner.setAdapter(sca);