从sqlite数据库中删除项目有错误

问题描述 投票:0回答:1

从 sqlite 数据库中删除项目时出现错误。

自定义适配器

public class PassAdapter extends RecyclerView.Adapter<PassViewHolder> {

    Context context;

    MainActivity mainActivity;

    private static final Object TAG = "SQLiteDatabaseInsert";

    List<LoginData> loginDataArrayList;
    DatabaseHelper databaseHelper;
    private LoginData loginData;

    SQLiteDatabase sqLiteDatabase;

    private int position;

    public PassAdapter(Context context, List<LoginData> loginDataArrayList) {
        this.context = context;
        this.loginDataArrayList = loginDataArrayList;
    }


    @NonNull
    @Override
    public PassViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int viewType) {
        View view = LayoutInflater.from(context.getApplicationContext()).inflate(R.layout.pass_item, viewGroup, false);
        PassViewHolder holder = new PassViewHolder(view);

        
        return holder;
    }

    @Override
    public void onBindViewHolder(@NonNull PassViewHolder holder, int position) {

       
        holder.name_view.setText(loginDataArrayList.get(holder.getBindingAdapterPosition()).getName());
        holder.login_view.setText(loginDataArrayList.get(holder.getBindingAdapterPosition()).getLogin());
        holder.password_view.setText(loginDataArrayList.get(holder.getBindingAdapterPosition()).getPass());
        holder.category_view.setText(loginDataArrayList.get(holder.getBindingAdapterPosition()).getCategory());
        holder.menuImage.setImageResource(R.drawable.item_menu_icon);
        
        holder.menuImage.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                PopupMenu popupMenu = new PopupMenu(context.getApplicationContext(), v);
                popupMenu.getMenuInflater().inflate(R.menu.menu_items, popupMenu.getMenu());
                popupMenu.show();
                popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
                    @Override
                    public boolean onMenuItemClick(MenuItem item) {
                        ClipboardManager clipboard = (ClipboardManager) context.getApplicationContext().getSystemService(CLIPBOARD_SERVICE);
                        int idMenuItem = item.getItemId();



                        Integer getId = loginDataArrayList.get(holder.getBindingAdapterPosition()).getId();
                        String loginToCopy = loginDataArrayList.get(holder.getBindingAdapterPosition()).getLogin();
                        
                        if (idMenuItem == R.id.copy_login) {
                            // copy login
                            ClipData loginClip = ClipData.newPlainText("Clip", String.valueOf(getId));
                            clipboard.setPrimaryClip(loginClip);
                            return true;
                        } else if (idMenuItem == R.id.copy_pass) {
                            // copy password
                           
                            return true;
                        } else if (idMenuItem == R.id.delete_item) {
                            // delete item
                          

                            Log.d("DetailAdapter", "Delete item with ID: " + String.valueOf(getId));
                            try {
                                databaseHelper.deleteItemById(getId);
                                removeItem(holder.getBindingAdapterPosition());
                            }
                            catch(Exception error) {
                                Log.d("DetailAdapter", "Error with delete item(error)");
                                error.printStackTrace();
                            }
                        }
                        return true;
                    }
                });
            }
        });
    }

    @Override
    public int getItemCount() {

        return loginDataArrayList.size();
    }

    public void removeItem(int position) {
        if (position >= 0 && position < loginDataArrayList.size()) {
            loginDataArrayList.remove(position);
            notifyItemRemoved(position);
            notifyItemRangeChanged(position, loginDataArrayList.size());
            Toast.makeText(context, "Deleted...", Toast.LENGTH_SHORT).show();
        }
    }
}

删除项目时出现问题

Log.d("DetailAdapter", "Delete item with ID: " + String.valueOf(getId));
                            try {
                                databaseHelper.deleteItemById(getId);
                                removeItem(holder.getBindingAdapterPosition());
                            }
                            catch(Exception error) {
                                Log.d("DetailAdapter", "Error with delete item(error)");
                                error.printStackTrace();
                            }

数据库助手

public void deleteItemsByCategory(String categoryName) {
        SQLiteDatabase db = this.getWritableDatabase();
        db.delete(TABLE_NAME, COLUMN_CATEGORY + " = ?", new String[]{categoryName});
        db.close();
    }

public void deleteItemById(Integer id) {
        SQLiteDatabase db = this.getWritableDatabase();
        int deletedRows = db.delete(TABLE_NAME, COLUMN_ID + " = ?", new String[]{String.valueOf(id)});
        db.close();
        if (deletedRows > 0) {
            Log.d("DatabaseHelper", "Item with ID " + String.valueOf(id) + " was deleted.");
        } else {
            Log.d("DatabaseHelper", "No item with ID " + String.valueOf(id) + " was found.");
        }
    }

在调试中获取正确的ID号

Integer getId = loginDataArrayList.get(holder.getBindingAdapterPosition()).getId();

但是在调用databaseHelper.deleteItemById之后得到这个错误。 数据库中有具有正确 ID 的项目,有来自数据库的正常列表。

我不明白什么是看不见的。请帮忙。

2024-07-23 23:03:09.775   933-933   System.err              com.theray.passbox                   W  java.lang.NullPointerException: Attempt to invoke virtual method 'void com.user.passbox.DatabaseHelper.deleteItemById(java.lang.Integer)' on a null object reference
2024-07-23 23:03:09.778   933-933   System.err              com.theray.passbox                   W      at com.theray.passbox.PassAdapter$1$1.onMenuItemClick(PassAdapter.java:122)
2024-07-23 23:03:09.778   933-933   System.err              com.theray.passbox                   W      at android.widget.PopupMenu$1.onMenuItemSelected(PopupMenu.java:109)

从数据库中删除对象。 (这个应用程序想要我添加一些文本,所以我这样做了(编码太多:D) fdasjgfjswgtfrwesfbsdjuhgsdfsdjbfjugwsefruewuitfgweifhowefjpoqajfcisvuffgsdufgurguweqigruiewgru

java android database sqlite
1个回答
0
投票

现在工作谢谢!

databaseHelper = new DatabaseHelper(context.getApplicationContext());
© www.soinside.com 2019 - 2024. All rights reserved.