sql >> データベース >  >> RDS >> SQLite

EditTextのユーザー入力でスピナーのフィールドを更新するにはどうすればよいですか?

    問題は、スピナーが選択した位置(0、1、2など)を行のIDとして使用していることです。最初の行IDは1、次に2などになります( おそらく、しかし確実ではありません。つまり、何らかの理由で行を削除し、シーケンスにギャップがあります

    そのため、現在発生しているのは、行IDとスピナー位置の差が1であるため、何も更新されていないか、別の行が更新されています。

    行IDをスピナー位置に変換する何らかの方法を使用する必要があります(たとえば、最初の配列の同じインデックスのそれぞれのIDを持つ2番目の配列)、または、私が行うことは、 CursorAdpaterの柔軟性 、SimpleCursorAdapterなど 次に、spinner.getSelectedItemId()を使用します spinner.getSelectedItemPosition()の代わりに 。

    CursorAdapterを使用するには、 _idという行が必要です。 (例:private static final String KEY_ID = "id";を変更します to 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の使用 、これは、private staticではなく'publicstatic'を提案する理由の例です。 。

    SimpleCursorAdpaterには微妙な違いがあります;

    • 3番目 paramterはカーソルです
    • 4番目 表示されるカーソル内の列名の文字列配列です(5番目のパラメータと一致する必要があります)。
    • 5日 データが配置されるビューのIDです(simple_list_item_1の場合は、上記のandroid.R.id.text1とともに1つの列名を使用します)

    更新に関しては、 spinner.getSelectedItemId()を使用してください 行ID。

    実例(行にデータがあると想定)

    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の設定

    以下を使用して、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. SubstrとInstrを使用してOracleで文字列を抽出する

    2. SQLServerでテーブル値関数を変更する

    3. KEYキーワードはどういう意味ですか?

    4. C#でSQL Serverデータベースからデータを取得するにはどうすればよいですか?