在Listview中获取长期搜索的内容

时间:2011-07-04 22:50:48

标签: java android database sqlite

由于某种原因,我的数据库无法执行.delete方法。

我有这张支票:

if(db.delete(clicked)){
            Log.i("MainAct.class","Deleted row: " + clicked + " successfully");
        } else {
            Log.i("MainAct.class","FAILURE Deleting row: " + clicked + " UNsuccessfully");
        }

它一直返回“FAILURE”,所以我认为这意味着它没有删除

public boolean delete(String row){
    open();
    Log.i("SmsDatabase.java", "DELETING: " + TABLE_NAME +
            "    id =?    " + "id = '" + row + "'");
     return this.db.delete(TABLE_NAME, "id = '" + row + "'", null) > 0;
}

它被称为罚款(顺便说一句,open()方法有一个if(!db.isOpen())所以它不只是总是打开我的数据库)但是由于某种原因它返回false。

我试过了:

返回this.db.delete(TABLE_NAME,“id =?”,new String [] {row})> 0;

但是在Log中它会返回奇怪的字符:“Lstring @ 406865”(不记得确切)点击了String。显然这不是我想要的。

为什么要这样做?

1 个答案:

答案 0 :(得分:1)

我将在答案中做出一些假设。 (1)您希望用户能够选择删除的任何内容的列表都填充了从您要删除它的数据库中获取的数据,(2)您已在onCreate中完成了设置或类似的事情设置listView的单击侦听器,或(3)设置要为上下文菜单注册的列表视图。我怀疑你没有为要删除的项目获取正确的ID。

在我的设置中,我有一个已注册上下文菜单的列表视图,我使用上下文菜单让他们选择编辑或从列表中删除项目,所以在我的onCreate中我调用registerForContextMenu(this.listView); 在我的上下文菜单中,我有:

   @Override
   public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo)
   {
      menu.setHeaderTitle("Update Item");
      menu.add(Menu.NONE, MENU_EDIT_ITEM,   0, "Edit Item");
      menu.add(Menu.NONE, MENU_REMOVE_ITEM, 1, "Remove Item");
   }

然后

   @Override
   public boolean onContextItemSelected(MenuItem item)
   {
      return (applyMenuChoice(item) || super.onContextItemSelected(item));
   }

然后

   private boolean applyMenuChoice(MenuItem item)
   {
      AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo();

      switch (item.getItemId())
      {
         case MENU_EDIT_ITEM:
         {
            // Since the user wants to edit an existing device we need to pass the
            // database id of the device - not it's position - to the details screen
            long idNum = info.id;
            Intent i = new Intent(getApplicationContext(), DeviceDataActivity.class);
            i.putExtra(DeviceListViewActivity.ID_EXTRA, String.valueOf(idNum));
            startActivityForResult(i, 0);
            break;
         }
         case MENU_REMOVE_ITEM:
         {
            long idNum = info.id;
            deviceDatabaseHelper.deleteItem(String.valueOf(idNum));
            initList();
            break;
         }
         default:
         {
            return false;
         }
      }
      return true;

   }// end applyMenuChoice

在我的数据库助手的代码中,我调用以下内容:

   public void deleteItem(String id)
   {
      SQLiteDatabase db = getWritableDatabase();
      db.delete(TABLE_NAME, _ID + "=?", new String[]
      { id });
      db.close();
   }

获取特定项目的另一个有用功能。请注意,如果记得将Item / YOUR_ITEM替换为您的对象,并根据需要使用您的表名(YOUR_TABLE)和BaseColumns._ID更新查询。

   /**
    * Use this method to return a single item object based on it's id
    * NOTE - from calling classes id may not be equal to position
    * @param id - the ID of the device being requested
    * @param db - the database to get it from
    * @return YOUR_ITEM - that device associated with the id
    */
   public static YOUR_ITEM getById(String id, SQLiteDatabase db)
   {
      String[] args = { id };
      Cursor c = db.rawQuery( "SELECT * FROM YOUR_TABLE WHERE " + 
                              BaseColumns._ID + "=?", args );
      c.moveToFirst();
      Item result = new Item().loadFrom(c);
      c.close();
      return (result);
   }

我不是一个非常有经验的数据库人,因此我非常依赖于许多示例,这些示例编写了一个数据库助手类(扩展了SQLiteOpenHelper),这有助于获取数据并将数据放入SQLiteDataBase中。希望这有帮助!