SQLite
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> SQLite

Làm cách nào để cập nhật một trường trong spinner của tôi với thông tin người dùng nhập vào EditText

Vấn đề của bạn là bạn đang sử dụng vị trí đã chọn của Spinner (0,1,2, v.v.) làm id của hàng. Id hàng đầu tiên sẽ là 1, sau đó là 2, v.v. ( có thể nhưng KHÔNG CHỨNG MINH, tức là xóa một hàng vì lý do nào đó và bạn có khoảng trống trong dãy ).

Do đó những gì bạn đang gặp phải là sự khác biệt 1 giữa id hàng và vị trí cột xoay, vì vậy không có gì hoặc hàng khác đang được cập nhật.

Bạn cần phải sử dụng một số phương pháp tính toán id hàng đến vị trí spinner (ví dụ:mảng thứ hai có id tương ứng cho cùng một chỉ mục của mảng đầu tiên), hoặc điều tôi muốn làm là, hãy tận dụng lợi thế của tính linh hoạt của CursorAdpater , chẳng hạn như SimpleCursorAdapter và sau đó sử dụng spinner.getSelectedItemId() thay vì spinner.getSelectedItemPosition() .

Để sử dụng A CursorAdapter, bạn sẽ cần một hàng có tên _id (ví dụ:thay đổi private static final String KEY_ID = "id"; thành public static final String KEY_ID = "_id"; )

Ghi chú! Tôi cũng khuyên bạn nên thay đổi, như tôi đã nói ở trên, private statics của bạn thành public statics ).

Ngoài ra, để sử dụng CursorAdapter, bạn sẽ cần một Cursor. Phương thức sau trong SpinnerDatabase.java là đủ.

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

Những điều sau có thể được sử dụng để thiết lập adpater:-

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

Ghi chú! việc sử dụng SpinnerDatabase.KEY_NAME , đây là một ví dụ về lý do tại sao tôi đề xuất 'public static' thay vì private static .

Có sự khác biệt nhỏ đối với SimpleCursorAdpater;

  • Thứ 3 tham số là Con trỏ,
  • Thứ 4 là một mảng Chuỗi gồm các tên cột trong con trỏ sẽ được hiển thị (phải khớp với tham số thứ 5),
  • Thứ 5 là id của các chế độ xem mà dữ liệu được đặt vào đó (đối với simple_list_item_1, hãy sử dụng 1 tên cột cùng với android.R.id.text1 như trên) .

và khi cập nhật, hãy sử dụng spinner.getSelectedItemId() cho id hàng.

Ví dụ làm việc (giả sử các hàng có dữ liệu)

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

Hoạt động 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());
                }
            }
        });

    }
}

Bố cục 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>

Cách sử dụng ví dụ:-

Spinner được chọn ( dữ liệu cập nhật ghi chú đã được nhập ):-

Đã chọn Bơ đậu phộng và Đã nhập dữ liệu cập nhật:-

Sau khi nhấp vào nút Chỉnh sửa:-

Đặt EditText thành Mục Spinner hiện được chọn

Phần sau có thể được sử dụng để đặt EditText thành giá trị của mục spinner hiện được chọn:-

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

        }
    });

Có thể được thêm vào sau khi đặt Bộ điều hợp trong Hoạt động.

Trong SO46330096Activity.java ở trên nó có thể theo dòng:-

        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. Tự động tăng giá trị 'id' khi chèn vào sqlite

  2. Khóa chính của SQLite AutoIncrement không hoạt động

  3. Trả về các hàng chỉ chứa các ký tự không phải chữ và số trong SQLite

  4. Cách hoạt động của hàm Time () trong SQLite

  5. Điều chỉnh hiệu suất SQLite