删除 ListView 中的数据库项(从 ArrayAdapter 创建)

Deleting database items in a ListView (created from an ArrayAdapter)

我使用 ArrayAdapter 创建了一个显示在 ListView 中的数据库。我希望在 ContextMenu 弹出删除选项时删除选定的 ListView 项目,如下所示:

我有一个 class 用于处理所有数据库功能,如删除。当我使用带有按钮的普通 onCLicklistener 时,删除功能正确执行,即删除正确的数据库条目并到达 if (cursor.moveToFirst()) 行。当我使用删除菜单项时,它 没有到达 附件中的 if (cursor.moveToFirst())delete handler 函数,因此不会删除该条目(下面的 ListView 代码片段后附有删除处理程序)。

任何 help/guidance/examples 将不胜感激。

我的 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);
        }


    }
}

数据库的delete handler函数如下:

 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;
   }
  • 删除 这个if (cursor.moveToFirst()) .
  • 确保 COLUMN_IDPRIMARY 键。
  • 检查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(); 
     } 

您没有调用任何方法从 users.setOnItemClickListener

的数据库中删除项目

正如您在评论中添加的那样,您所做的只是尝试从 ActionBaronItemClicked 方法中删除项目。

在你的 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_IDPRIMARY Key." 这背后的原因是为了避免口是心非,以防万一您添加了添加项目的功能运行 时间。