sql >> Database >  >> RDS >> SQLite

Hoe kan ik een veld van mijn spinner bijwerken met gebruikersinvoer in EditText

Uw probleem is dat u de geselecteerde positie van de Spinner (0,1,2 enz.) gebruikt als de id van de rij. De eerste rij-ID is 1, dan 2, enz. (waarschijnlijk maar NIET ZEKER, d.w.z. verwijder een rij om de een of andere reden en je hebt een gat in de reeks ).

Wat u momenteel ervaart, is een verschil van 1 tussen rij-ID en spinnerpositie, dus er wordt niets of een andere rij bijgewerkt.

Je moet ofwel een methode gebruiken om de rij-ID uit te werken naar de positie van de spinner (bijvoorbeeld een tweede array met de respectieve id voor dezelfde index van de eerste array), of, wat ik zou doen, is profiteren van de flexibiliteit van een CursorAdpater , zoals SimpleCursorAdapter en gebruik dan spinner.getSelectedItemId() in plaats van spinner.getSelectedItemPosition() .

Om A CursorAdapter te gebruiken, heeft u een rij nodig met de naam _id (bijv. verander private static final String KEY_ID = "id"; naar public static final String KEY_ID = "_id"; )

Opmerking! Ik zou ook willen voorstellen om, zoals ik hierboven heb gedaan, je private statics . te wijzigen naar public statics ).

Ook om een ​​CursorAdapter te gebruiken, heeft u een Cursor nodig. De volgende methode in SpinnerDatabase.java zou voldoende zijn.

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

Het volgende kan worden gebruikt om de adpater in te stellen:-

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

Opmerking! het gebruik van SpinnerDatabase.KEY_NAME , dit is een voorbeeld van waarom ik 'public static' voorstel in plaats van private static .

Er zijn subtiele verschillen voor de SimpleCursorAdpater;

  • 3e parameter is de cursor,
  • 4e is een String-array van de kolomnamen in de cursor die moet worden weergegeven (moet overeenkomen met de 5e parameter),
  • 5e zijn de id's van de weergaven waarin de gegevens zijn geplaatst (gebruik voor simple_list_item_1 1 kolomnaam samen met android.R.id.text1 zoals hierboven) .

en als het op de update aankomt, gebruik dan spinner.getSelectedItemId() voor de rij-ID.

Werkvoorbeeld (gaat ervan uit dat rijen gegevens bevatten)

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

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

    }
}

De lay-out 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>

Voorbeeld van gebruik:-

Spinner geselecteerd (de gegevens van de notitie-update zijn al ingevoerd ):-

Pindakaas geselecteerd en bijgewerkte gegevens ingevoerd:-

Nadat u op de knop Bewerken hebt geklikt:-

De EditText instellen op het momenteel geselecteerde Spinner-item

Het volgende kan worden gebruikt om de EditText in te stellen op de waarde van het momenteel geselecteerde spinneritem:-

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

        }
    });

De kan worden toegevoegd na het instellen van de Adapter in de Activiteit.

In de bovenstaandeSO46330096Activity.java het zou de lijn kunnen volgen:-

        spinner.setAdapter(sca);



  1. fout bij het installeren van psycopg2, bibliotheek niet gevonden voor -lssl

  2. Oracle pivot met subquery

  3. SQL Server (MSSQL DBA) Database-tutorials voor beginners Databasebeheerders

  4. Verander van SQLite naar PostgreSQL in een nieuw Rails-project