删除随机行时,用于更新表索引值的优化代码

时间:2013-07-27 09:22:28

标签: android sqlite

我正在使用一个需要一些数据库操作的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();
}

我创建了这个函数来完成所有数据库操作。这将创建一个新的临时表,并在随机删除过程后复制原始表中的所有内容。 (现在表的索引值可能像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);

我认为这种逻辑和代码是废话。我认为有更好的方法来做同样的事情。请帮忙

2 个答案:

答案 0 :(得分:3)

如果您正在搜索链接列表位置和数据库ID的方法,我认为没有。您的上述代码帮助我做了类似的事情。

答案 1 :(得分:1)

您应该使用专门用于此类情况的CursorAdapter,而不是SimpleAdapter。您只需将表主键命名为“_id”。在这种情况下,您始终可以通过调用 getItemId(position)获取ListView项的数据库密钥,然后从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示例。