sql >> Databáze >  >> RDS >> SQLite

Jak mohu aktualizovat pole mého číselníku pomocí uživatelského vstupu v EditText

Váš problém je, že jako ID řádku používáte vybranou pozici číselníku (0,1,2 atd.). ID prvního řádku bude 1, pak 2 atd. (pravděpodobně, ale NE URČITĚ, tj. z nějakého důvodu smažte řádek a v sekvenci máte mezeru ).

To, co aktuálně zažíváte, je tedy rozdíl 1 mezi ID řádku a pozicí číselníku, takže se neaktualizuje buď nic, nebo se aktualizuje jiný řádek.

Buď musíte použít nějakou metodu, jak zjistit ID řádku na pozici spinneru (např. druhé pole, které má příslušné ID pro stejný index prvního pole), nebo, co bych udělal, je využít výhody flexibilitu CursorAdpater , například SimpleCursorAdapter a poté použijte spinner.getSelectedItemId() místo spinner.getSelectedItemPosition() .

Chcete-li použít A CursorAdapter, budete potřebovat řádek s názvem _id (např. změňte private static final String KEY_ID = "id"; na public static final String KEY_ID = "_id"; )

Poznámka! Navrhoval bych také změnit, jak jsem uvedl výše, vaši private statics na public statics ).

Také k použití CursorAdapter budete potřebovat Cursor. Následující metoda v SpinnerDatabase.java by stačila.

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

K nastavení adaptéru lze použít následující:-

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

Poznámka! použití SpinnerDatabase.KEY_NAME , toto je příklad toho, proč navrhuji „veřejné statické“ namísto private static .

Existují drobné rozdíly pro SimpleCursorAdpater;

  • 3. parametrem je kurzor,
  • 4. je pole String názvů sloupců v kurzoru, které se mají zobrazit (mělo by odpovídat 5. parametru),
  • 5. je ID zobrazení, do kterých jsou data umístěna (pro simple_list_item_1 použijte 1 název sloupce spolu s android.R.id.text1, jak je uvedeno výše) .

a pokud jde o aktualizaci, použijte spinner.getSelectedItemId() pro ID řádku.

Pracovní příklad (předpokládá, že řádky obsahují 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);
    }
}

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

    }
}

Rozložení 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>

Příklad použití:-

Je vybrán číselník (údaje o aktualizaci poznámky již byly zadány ):-

Vybráno arašídové máslo a zadány aktualizované údaje :-

Po kliknutí na tlačítko Upravit :-

Nastavení editačního textu na aktuálně vybranou položku číselníku

K nastavení EditTextu na hodnotu aktuálně vybrané položky číselníku lze použít následující:-

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

        }
    });

Lze přidat po nastavení Adaptéru v Aktivitě.

Ve výše uvedenémSO46330096Activity.java mohlo by to následovat :-

        spinner.setAdapter(sca);



  1. SQLite - Pusťte databázi

  2. Mysql počítá instance podřetězce a poté seřaďte podle

  3. Změna hesla při přihlášení SA na SQL Server (příklad T-SQL)

  4. MySQL - UPDATE více řádků s různými hodnotami v jednom dotazu