0

私は、いくつかのDB操作を必要とするAndroidアプリを使用しています。同じために、以下のコードを使用しています。このコードを使用する理由は、テーブルから取得したデータを使用して ListView に表示し、ランダム リストを削除する必要があるためです。ListView とテーブルの間で見つけられる唯一の関係は、リストの位置とインデックス値です。テーブル。リストは自動的に更新されますが、テーブル インデックスは更新されません。

public void deleteValues(int position) 
{
        SQLiteDatabase db = this.getWritableDatabase();
        position = position + 1;
        String id = String.valueOf(position);
        db.delete(FUEL_TABLE, KEY_ID + "="+id,null);
//Updating table

        String CREATE_TABLE_COPY = "CREATE TABLE " + "COPIED_TABLE" + "("
                + KEY_ID + " INTEGER PRIMARY KEY," + KEY_DATE + " TEXT,"
                + KEY_TIME + " TEXT," + KEY_PRICE + " TEXT," + KEY_AMOUNT + " TEXT," + KEY_FUELID + " INTEGER" + ")";
        db.execSQL(CREATE_TABLE_COPY);
        String db_insert_command;
        db_insert_command = "INSERT INTO COPIED_TABLE (" + KEY_DATE +", " + KEY_TIME + ", " + KEY_PRICE + ", " + KEY_AMOUNT + ", " + KEY_FUELID + ") " +
                "SELECT " + KEY_DATE +", " + KEY_TIME + ", " + KEY_PRICE + ", " + KEY_AMOUNT + ", " + KEY_FUELID + " FROM "+ FUEL_TABLE;
        System.out.println(db_insert_command);
        db.execSQL(db_insert_command);
        db.execSQL("DROP TABLE " + FUEL_TABLE);
//Creating FUEL_TABLE again
        String CREATE_TABLE = "CREATE TABLE " + FUEL_TABLE + "("
                + KEY_ID + " INTEGER PRIMARY KEY," + KEY_DATE + " TEXT,"
                + KEY_TIME + " TEXT," + KEY_PRICE + " TEXT," + KEY_AMOUNT + " TEXT," + KEY_FUELID + " INTEGER" + ")";
        db.execSQL(CREATE_TABLE);
        db.execSQL("INSERT INTO " + FUEL_TABLE + " SELECT * FROM COPIED_TABLE");
        db.execSQL("DROP TABLE COPIED_TABLE");
        db.close();
}

すべての DB 操作を行うために、この関数を作成しました。これにより、新しい一時テーブルが作成され、ランダム削除プロセスの後に元のテーブルからすべての内容がコピーされます。(これで、テーブルのインデックス値は 1,2,3,5,6 のようになります... インデックス 4 の行が削除されます。したがって、一時テーブルは完全に昇順のインデックスを持つ新しい行を作成します。この一時テーブルは次に元のテーブルが再作成された後、元のテーブルにコピーされます。

じぶんのOnItemLongClickListener

lv.setOnItemLongClickListener(new OnItemLongClickListener() {

                public boolean onItemLongClick(AdapterView<?> arg0, View arg1,
                        final int pos, long id) {
                    // TODO Auto-generated method stub

                    alert.setTitle("Fuel Calculator");

                    // set dialog message
                    alert
                        .setMessage("Delete this entry?")
                        .setCancelable(false)
                        .setPositiveButton("Yes",new DialogInterface.OnClickListener() {
                            public void onClick(DialogInterface dialog,int id) {

                                db.deleteValues(pos);
                                System.out.println("Performing delete from DB and populating Listsview again");
                                Intent i = new Intent(getApplicationContext(), ListviewActivity.class);
                                startActivity(i);
                            }
                          })
                        .setNegativeButton("No",new DialogInterface.OnClickListener() {
                            public void onClick(DialogInterface dialog,int id) {

                                dialog.cancel();
                            }
                        }); 

私のアダプター

ListAdapter adapter = new SimpleAdapter(this, Items,
                    R.layout.list_item,new String[] { "date","time", "amount", "price" },
                    new int[] {R.id.date, R.id.time, R.id.price, R.id.capacity });

            setListAdapter(adapter);

このロジックとコードはくだらないと思います。同じことをするためのより良い方法があると思います。助けてください

4

2 に答える 2

1

SimpleAdapter の代わりに、そのような場合に特に意図された CursorAdapter を使用する必要があります。テーブルの主キーに「_id」という名前を付けるだけです。その場合、getItemId(position)を呼び出して ListView アイテムの DB キーをいつでも取得し、必要なレコードを DB から削除できます。lvが ListViewである以下のようなもの:

public void deleteValues(int position) 
{
        SQLiteDatabase db = this.getWritableDatabase();
        db.delete(FUEL_TABLE, KEY_ID + "="+lv.getItemId(position),null);
        db.close();
}

そして確かに、この CREATE/COPY/DROP テーブルの処理はすべて忘れる必要があります。CursorAdapter の例を検索します。

于 2013-07-29T08:52:22.773 に答える