Удаление элементов базы данных в ListView (создан из ArrayAdapter) - PullRequest
0 голосов
/ 28 июня 2018

Я создал базу данных, которая отображается в ListView с использованием ArrayAdapter. Я хочу, чтобы выбранный элемент ListView был удален при появлении ContextMenu с параметром удаления, как показано ниже:

enter image description here

У меня есть класс для обработки всех функций базы данных, таких как удаление. Когда я использую обычный onCLicklistener с кнопкой, функция удаления выполняется правильно, т.е. она удаляет правильную запись в базе данных и достигает строки if (cursor.moveToFirst()). Когда я использую пункт меню удаления, он не достигает if (cursor.moveToFirst ()) в присоединенной функции delete handler и поэтому не удаляет запись (прикрепленный после кода ниже ListView - это обработчик удаления).

Буду очень признателен за любую помощь / руководство / примеры.

My ListView заполняется следующим образом:

  public class Listview extends AppCompatActivity
  {
   private ListView users;
   FloatingActionButton fab;
   MyDBHandler dbHandler;
   ArrayAdapter<String> arrayAdapter;
   String lists;


    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
       super.onCreate(savedInstanceState);

        StrictMode.ThreadPolicy policy = new 
        StrictMode.ThreadPolicy.Builder().permitAll().build();
        StrictMode.setThreadPolicy(policy);

        setContentView(R.layout.activity_listview);

       // Create back button in action bar
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
        getSupportActionBar().setHomeButtonEnabled(true);


        users = (ListView) findViewById(R.id.clientlst);

        // Floating Action bar for adding new data entries
        fab = (FloatingActionButton) findViewById(R.id.fab1);

        MyDBHandler dbHandler = new MyDBHandler(getApplicationContext());

        lists = dbHandler.loadHandler();

      //Create a list of the saved database String array items and split into 
     Strings
       ArrayList<String> list = new ArrayList<>   
       (Arrays.asList(lists.split("\n")));


        // Create the List view adapter
        arrayAdapter = new ArrayAdapter<String>(Listview.this, 
        android.R.layout.simple_list_item_1, android.R.id.text1, list)

       {
            @Override     // Edit the Text colour of the Listview items
        public View getView(int position, View convertView, ViewGroup parent) 
        {
                String Items = arrayAdapter.getItem(position);
                String[] separated = Items.split(":");
                String Name123 = separated[1];   // This will contain "Name"
                TextView textView = (TextView) super.getView(position, 
                convertView, parent);
                textView.setTextColor(Color.BLUE);
                textView.setText(Name123);
                return textView;
            }
        };

        users.setAdapter(arrayAdapter);
        registerForContextMenu(users);

    // Create an action to be performed by each click of an item in the
         users.setOnItemClickListener
               (
                     new AdapterView.OnItemClickListener()
                     {
                        @Override
                        public void onItemClick(AdapterView<?> parent, View 
                        view, int position, long id) {

                      String Items = arrayAdapter.getItem(position);
                            String[] separated = Items.split(":");
             String ip = separated[5];   // This will contain "PORT address"
             String port = separated[3]; // This will contain "IP number"
                            Toast.makeText(Listview.this, port + ip, 
                                Toast.LENGTH_LONG).show();

                        } // onItemClick

                    } // OnItemClickListener View

            ); // OnItemClickListener


    fab.setOnClickListener(new View.OnClickListener() {
                               @Override
                               public void onClick(View view)
                               {

                                   Toast.makeText(Listview.this, "Fab 
                                 Clicked", Toast.LENGTH_LONG).show();
                               }
                           }
      );
  } 

    @Override
    public void onCreateContextMenu(ContextMenu menu, View v, 
    ContextMenu.ContextMenuInfo menuInfo)
    {
      super.onCreateContextMenu(menu, v, menuInfo);

      menu.setHeaderTitle("Choose an option");
      MenuInflater inflator = getMenuInflater();
      inflator.inflate(R.menu.example_menu, menu);
  }

  @Override
  public boolean onContextItemSelected(MenuItem item)
  {

      AdapterView.AdapterContextMenuInfo info = 
     (AdapterView.AdapterContextMenuInfo) item.getMenuInfo();

      switch (item.getItemId())
      {
          case R.id.option_1:
              arrayAdapter.getItem(info.position);

            MyDBHandler dbHandler = new MyDBHandler(getApplicationContext());

            String Items= arrayAdapter.getItem(info.position);
            String[] separated = Items.split(":");
            String ip = separated[3];                          // This will 
                                    contain "IP addr"
            String names = separated[1];                       // This will 
            contain "Name"

            Log.d("LATE",names + ip);

            dbHandler.deleteHandler(names,ip);
            arrayAdapter.notifyDataSetChanged();               // Refresh the 
            listview

            Toast.makeText(this, "Deleted", Toast.LENGTH_SHORT).show();
            Intent listviews1 = new Intent(Listview.this, Listview.class);
            startActivity(listviews1);
            return true;

        case R.id.option_2:
            Intent listviews2 = new Intent(Listview.this, Listview.class);
            startActivity(listviews2);
            Toast.makeText(this, "Updated", Toast.LENGTH_SHORT).show();
            return true;

        default:
            return super.onContextItemSelected(item);
        }


    }
}

Функция обработки базы данных базы данных выглядит следующим образом:

 public void deleteHandler(String username, String IP)
  {
    //boolean result = false;

    String query = "Select*FROM " + TABLE_USER + " WHERE " + COLUMN_NAME + " 
    = '" +  String.valueOf(username) + "'" + " and " + COLUMN_ID + " = '" +  
    String.valueOf(IP) + "'";

    SQLiteDatabase db = this.getWritableDatabase();

    Cursor cursor = db.rawQuery(query, null);

    Log.d ("MEH", String.valueOf(cursor));

    User user = new User();

    if (cursor.moveToFirst())
    {
        user.setUserName(cursor.getString(2));
        user.setID(cursor.getString(3));

        db.delete(TABLE_USER, COLUMN_NAME + "=? and " + COLUMN_ID + "=?",

        new String[]
        {
                String.valueOf(user.getUserName()),
                String.valueOf(user.getID())
        });

        cursor.close();

        //result = true;
    }

    db.close();

    //return result;
   }

Ответы [ 2 ]

0 голосов
/ 28 июня 2018

Вы не вызываете какой-либо метод для удаления элемента из базы данных из вашего users.setOnItemClickListener

Как вы добавили в своем комментарии, все, что вы делаете, это пытаетесь удалить элемент из вашего ActionBar onItemClicked метода.

Сделайте то же самое в вашем OnItemClickListener

Обновление2 : изменение в требовании

 users.setLongClickable(true);
 users.setOnItemLongClickListener(new OnItemLongClickListener() {
public boolean onItemLongClick(AdapterView<?> parent, View v, int position, long id) {
    //Do your tasks here


            AlertDialog.Builder alert = new AlertDialog.Builder(
                    YourActivity.this);
            alert.setTitle("Alert!!");
            alert.setMessage("Choose an option");
            alert.setPositiveButton("Edit", new OnClickListener() {

                @Override
                public void onClick(DialogInterface dialog, int which) {
                     //do your work here                      
                    dialog.dismiss();

                }
            });
            alert.setNegativeButton("Delete", new OnClickListener() {

                @Override
                public void onClick(DialogInterface dialog, int which) {
                    //perform your delete callback here
                    dialog.dismiss();
                }
            });

            alert.show();

    return true;
  }
  });

Обновление1: Пояснения к Ответ Амии ,

  1. Причина, по которой cursor.moveToFirst() не очень хороший вариант, потому что это утверждение не нужно Компилятор знает точное место, куда можно попасть войдите в свою БД. Один обычно выполняет cursor.moveToFirst() когда вам нужно перебрать все или некоторые элементы данных из вашего базы данных.
  2. " Убедитесь, что COLUMN_ID равно PRIMARY Key. " Причина этого заключается в том, чтобы избежать двуличия в случае, если вы когда-либо добавите функциональность добавления элементов во время выполнения.
0 голосов
/ 28 июня 2018
  • УДАЛИТЬ это if (cursor.moveToFirst()).
  • Убедитесь, что COLUMN_ID равен ПЕРВИЧНЫЙ Ключ.
  • Проверка deleteHandler() метод вызывается или нет.

Вы должны попробовать с

  public void deleteHandler(String username, String IP)
     {
        SQLiteDatabase db = this.getWritableDatabase();
                db.delete(TABLE_USER, 
                    COLUMN_NAME  + " = ? AND " + COLUMN_ID  + " = ?", 
                    new String[] {username, IP});
                db.close(); 
     } 
...