SQLite
 sql >> база данни >  >> RDS >> SQLite

Как мога да актуализирам поле на моя спинер с въвеждане от потребителя в EditText

Вашият проблем е, че използвате избраната позиция на Spinner (0,1,2 и т.н.) като идентификатор на реда. Идентификаторът на първия ред ще бъде 1, след това 2 и т.н. (вероятно, но НЕ СИГУРНО, т.е. изтрийте ред по някаква причина и имате празнина в последователността ).

По този начин това, което изпитвате в момента, е разлика от 1 между идентификатора на реда и позицията на въртене, така че или нищо, или друг ред се актуализира.

Или трябва да използвате някакъв метод за изработване на идентификатора на реда до позицията на въртене (например втори масив, който има съответния идентификатор за същия индекс на първия масив), или, това, което бих направил, е да се възползвам от гъвкавост на CursorAdpater , като SimpleCursorAdapter и след това използвайте spinner.getSelectedItemId() вместо spinner.getSelectedItemPosition() .

За да използвате A CursorAdapter, ще ви е необходим ред, наречен _id (напр. промяна на private static final String KEY_ID = "id"; към public static final String KEY_ID = "_id"; )

Забележка! Също така бих предложил да промените, както направих по-горе, вашата private statics към public statics ).

Също така, за да използвате CursorAdapter, ще ви е необходим курсор. Следният метод в SpinnerDatabase.java би бил достатъчен.

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

Следното може да се използва за настройка на адаптера:-

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

Забележка! използването на SpinnerDatabase.KEY_NAME , това е пример защо предлагам 'public static' вместо private static .

Има малки разлики за SimpleCursorAdpater;

  • 3-то параметърът е курсора,
  • 4-ти е низов масив от имената на колоните в курсора, който да се показва (трябва да съвпада с 5-ти параметър),
  • 5-то е идентификаторите на изгледите, в които се поставят данните (за simple_list_item_1 използвайте име на 1 колона заедно с android.R.id.text1 както по-горе) .

и когато става въпрос за актуализация, използвайте spinner.getSelectedItemId() за идентификатора на реда.

Работен пример (приема, че редовете имат данни)

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

Дейност 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());
                }
            }
        });

    }
}

Оформлението 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>

Примерно използване:-

Избрано е въртящо се (данните за актуализиране на бележка вече са въведени ):-

Избрано е фъстъчено масло и са въведени актуализирани данни:-

След щракване върху бутона Редактиране :-

Задаване на EditText към текущо избрания Spinner Item

Следното може да се използва, за да зададете EditText на стойността на текущо избрания въртящ елемент:-

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

        }
    });

Може да се добави след задаване на адаптера в активността.

В горнияSO46330096Activity.java може да следва реда :-

        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. Как да подобрим производителността на базата данни SQLite за android

  2. Външен ключ на SQLite

  3. SQLite - Архивиране на база данни във файл

  4. Как да получите текущото време в SQLite

  5. Върнете списък с външни ключове в SQLite