SQLite
 sql >> Baza danych >  >> RDS >> SQLite

Jak mogę zaktualizować pole mojego pokrętła za pomocą danych wprowadzonych przez użytkownika w EditText?

Twój problem polega na tym, że używasz wybranej pozycji Spinnera (0,1,2 itd.) jako identyfikatora wiersza. Identyfikatorem pierwszego wiersza będzie 1, potem 2 itd. (prawdopodobnie, ale NIE NA PEWNO, tzn. usuń wiersz z jakiegoś powodu, a masz przerwę w sekwencji ).

W związku z tym to, czego obecnie doświadczasz, to różnica 1 między identyfikatorem wiersza a pozycją pokrętła, więc albo nic nie jest aktualizowane, albo inny wiersz.

Musisz albo zastosować jakąś metodę obliczenia identyfikatora wiersza do pozycji pokrętła (np. druga tablica, która ma odpowiedni identyfikator dla tego samego indeksu pierwszej tablicy), albo skorzystać z elastyczność CursorAdpater , na przykład SimpleCursorAdapter a następnie użyj spinner.getSelectedItemId() zamiast spinner.getSelectedItemPosition() .

Aby użyć adaptera kursora, potrzebujesz wiersza o nazwie _id (np. zmień private static final String KEY_ID = "id"; do public static final String KEY_ID = "_id"; )

Notatka! Proponuję również zmienić, tak jak powyżej, swoje private statics do public statics ).

Również aby użyć CursorAdapter, będziesz potrzebować Cursor. Poniższa metoda w SpinnerDatabase.java wystarczy.

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

Do konfiguracji adaptera można wykorzystać następujące elementy:-

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

Notatka! użycie SpinnerDatabase.KEY_NAME , jest to przykład tego, dlaczego proponuję „statyczne publiczne” w przeciwieństwie do private static .

Istnieją niewielkie różnice w przypadku SimpleCursorAdpater;

  • Trzeci parametrem jest Kursor,
  • Czwarty jest tablicą ciągów nazw kolumn w kursorze do wyświetlenia (powinien pasować do 5. parametru),
  • piąty to identyfikatory widoków, w których umieszczane są dane (dla simple_list_item_1 użyj 1 nazwy kolumny wraz z android.R.id.text1 jak powyżej) .

a jeśli chodzi o aktualizację, użyj spinner.getSelectedItemId() dla identyfikatora wiersza.

Przykład roboczy (przy założeniu, że wiersze zawierają dane)

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

Aktywność 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());
                }
            }
        });

    }
}

Układ 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>

Przykładowe użycie:-

Wybrano spinner (uwaga dane aktualizacji zostały już wprowadzone ):-

Wybrano masło orzechowe i wprowadzono zaktualizowane dane :-

Po kliknięciu przycisku Edytuj :-

Ustawianie EditText na aktualnie wybrany element Spinnera

Poniższe mogą być użyte do ustawienia EditText na wartość aktualnie wybranego elementu spinnera:-

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

        }
    });

Można dodać po ustawieniu adaptera w działaniu.

W powyższymSO46330096Activity.java może podążać za linią :-

        spinner.setAdapter(sca);



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak przetestować metody, które radzą sobie z bazą danych SQLite w Androidzie?

  2. Android:Jak ponownie zażądać Cursora, aby odświeżyć ListView po usunięciu wiersza bazy danych?

  3. Emulator a pamięć karty SD urządzenia Samsung

  4. Dołącz bazę danych w SQLite

  5. Zapytanie tylko o pierwsze dane z tabeli