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

Hvordan kan jeg opdatere et felt af min spinner med brugerinput i EditText

Dit problem er, at du bruger Spinnerens valgte position (0,1,2 osv.) som rækkens id. Det første række-id vil være 1, derefter 2 osv. (sandsynligvis, men IKKE SIKKERT, dvs. slet en række af en eller anden grund, og du har et hul i rækkefølgen ).

Som sådan er det, du oplever i øjeblikket, en forskel på 1 mellem række-id og spinnerposition, så enten intet eller en anden række bliver opdateret.

Du skal enten bruge en eller anden metode til at beregne række-id'et til spinner-position (f.eks. et andet array, der har det respektive id for det samme indeks for det første array), eller hvad jeg ville gøre er at drage fordel af fleksibilitet af en CursorAdpater , såsom SimpleCursorAdapter og brug derefter spinner.getSelectedItemId() i stedet for spinner.getSelectedItemPosition() .

For at bruge A CursorAdapter skal du bruge en række kaldet _id (f.eks. ændre private static final String KEY_ID = "id"; til public static final String KEY_ID = "_id"; )

Bemærk! Jeg vil også foreslå at ændre din private statics, som jeg har ovenfor til public statics ).

For at bruge en CursorAdapter skal du også bruge en Cursor. Følgende metode i SpinnerDatabase.java ville være tilstrækkelig.

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

Følgende kan bruges til at konfigurere adapteren:-

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

Bemærk! brugen af ​​SpinnerDatabase.KEY_NAME , dette er et eksempel på, hvorfor jeg foreslår 'offentlig statisk' i modsætning til private static .

Der er sublte forskelle for SimpleCursorAdpater;

  • 3. parameter er markøren,
  • 4. er en streng-array af kolonnenavnene i markøren, der skal vises (skal matche 5. parameter),
  • 5. er id'erne for de visninger, som dataene er placeret i (til simple_list_item_1 brug 1 kolonnenavn sammen med android.R.id.text1 som ovenfor) .

og når det kommer til opdateringen, brug spinner.getSelectedItemId() for række-id.

Arbejdseksempel (antager, at rækker har data)

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

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

    }
}

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

Eksempel på brug:-

Spinner valgt (bemærk, at opdateringsdata allerede er indtastet ):-

Peanut Butter valgt og opdaterede data indtastet :-

Efter at have klikket på knappen Rediger :-

Indstilling af EditText til det aktuelt valgte spinneremne

Følgende kan bruges til at indstille EditText til værdien af ​​det aktuelt valgte spinneremne:-

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

        }
    });

Den kunne tilføjes efter indstilling af adapteren i aktiviteten.

I ovenståendeSO46330096Activity.java det kunne følge linjen :-

        spinner.setAdapter(sca);



  1. Forstå SQL Server ÆNDRINGSTABEL TILFØJ KOLONNE-erklæring

  2. PostgreSQL høj tilgængelighed med Master-Slave &Master-Master-arkitekturer

  3. Oracle - update join - ikke nøglebevaret tabel

  4. Oprettelse af en database dump for specifikke tabeller og poster Postgres