Получение того, что было Longclick в Listview - PullRequest
1 голос
/ 05 июля 2011

По какой-то причине моей базе данных не удается выполнить метод .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 =?", новая строка [] {row})> 0;

Но в журнале он возвращает странные символы в строке: «[Lstring @ 406865» (точно не помню) для нажатой строки.И, очевидно, это не то, что я хочу.

Почему он это делает?

1 Ответ

1 голос
/ 05 июля 2011

Я собираюсь сделать некоторые предположения в своем ответе.(1) Список того, что вы хотите, чтобы пользователь мог выбрать для удаления, заполнен данными, полученными из базы данных, из которой вы его удаляете, (2) Вы выполнили настройку в onCreate или что-то в этом роде.установить прослушиватель щелчка listView или (3) настроить просмотр списка для регистрации в контекстном меню.Я подозреваю, что вы просто не получаете правильный идентификатор для удаляемого элемента.

В моей настройке у меня есть просмотр списка, который зарегистрирован для контекстного меню, я использую контекстное меню, чтобы позволить им выбрать для редактированияили удалите элемент из списка, чтобы в моем 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);
   }

Я не очень опытный парень из БД, поэтомуЯ в значительной степени опирался на множество примеров, в которых был закодирован вспомогательный класс базы данных (extends SQLiteOpenHelper), который облегчал получение и размещение данных в SQLiteDataBase.Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...