Java 删除室内数据库

Java 删除室内数据库,java,android,android-studio,android-recyclerview,android-room,Java,Android,Android Studio,Android Recyclerview,Android Room,我是学习室数据库!! 我知道如何将数据从房间数据库插入和检索到回收器视图!!但在删除操作中,我得到了“无适配器连接跳过布局”的错误 当任何人点击“回收者”视图上的“删除”按钮时,我想要什么。应删除该任务 这就是为什么我还在接口中使用了delete方法,并在Recycler视图适配器中添加了接口,这将回调MainActivity,以便我们删除并更新Recycler视图 下面给出了我所有的代码 下面是名为Task的实体类 @Entity public class Task implements Se

我是学习室数据库!! 我知道如何将数据从房间数据库插入和检索到回收器视图!!但在删除操作中,我得到了“无适配器连接跳过布局”的错误

当任何人点击“回收者”视图上的“删除”按钮时,我想要什么。应删除该任务

这就是为什么我还在接口中使用了delete方法,并在Recycler视图适配器中添加了接口,这将回调MainActivity,以便我们删除并更新Recycler视图

下面给出了我所有的代码

下面是名为Task的实体类

@Entity
public class Task implements Serializable {
    @PrimaryKey(autoGenerate =  true)
    private int id;
    @ColumnInfo(name = "task_name")
    private String task_name;
    @ColumnInfo
    private String task_desc;
    @ColumnInfo
    private String comment;

    @ColumnInfo
    private String task_comp_date;
    @ColumnInfo
    private String activate;



    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getTask_name() {
        return task_name;
    }

    public void setTask_name(String task_name) {
        this.task_name = task_name;
    }

    public String getTask_desc() {
        return task_desc;
    }

    public void setTask_desc(String task_desc) {
        this.task_desc = task_desc;
    }

    public String getTask_comp_date() {
        return task_comp_date;
    }

    public void setTask_comp_date(String task_comp_date) {
        this.task_comp_date = task_comp_date;
    }

    public String getComment() {
        return comment;
    }

    public void setComment(String comment) {
        this.comment = comment;
    }

    public String getActivate() {
        return activate;
    }

    public void setActivate(String activate) {
        this.activate = activate;
    }


}
我的数据访问对象名为TaskDao

@Dao
public interface TaskDao {
    @Query("SELECT * FROM task")
    List<Task> getAll();
    @Insert
    void insert(Task task);
    @Delete
    void delete(Task task);
    @Update
    void update(Task task);
}
我的DataBaseClient命名为DataBaseClient

public class DatabaseClient {
    private Context context;
    private static DatabaseClient mInstace;

    private AppDataBase appDataBase;

    public DatabaseClient(Context context) {
        this.context = context;
        appDataBase = Room.databaseBuilder(context,AppDataBase.class,"MyDailyTask").build();
    }
    public static synchronized DatabaseClient getInstance(Context context)
    {
        if(mInstace == null)
        {
            mInstace = new DatabaseClient(context);
        }
        return mInstace;
    }
    public AppDataBase getAppDataBase()
    {
        return appDataBase;
    }
}
我的RecyclerView适配器

        public class TaskAdapter extends RecyclerView.Adapter<TaskAdapter.MyViewHolder> {
private Context context;
private List<Task> taskList;
public interface OnDeleteClickListener
    {
        void OnDeleteClickListener(Task task);
    }
    private OnDeleteClickListener onDeleteClickListener;

    public TaskAdapter(Context context, List<Task> taskList) {
        this.context = context;
        this.taskList = taskList;
    }

    public void setOnDeleteClickListener(OnDeleteClickListener onDeleteClickListener) {
        this.onDeleteClickListener = onDeleteClickListener;
    }

    @NonNull
    @Override
    public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view;
       view = LayoutInflater.from(context).inflate(R.layout.view_task_list,parent,false);
       MyViewHolder myViewHolder = new MyViewHolder(view);
       return myViewHolder;
    }

    @Override
    public void onBindViewHolder(@NonNull MyViewHolder holder, int position) {
       holder.setData(taskList.get(position).getTask_name(),taskList.get(position).getTask_desc(),taskList.get(position).getComment(),taskList.get(position).getTask_comp_date(),position);
    }

    @Override
    public int getItemCount() {
        return taskList.size();
    }

    class MyViewHolder extends RecyclerView.ViewHolder {

        private TextView t1,t2,t3,t4,t5;
        private ImageView view;
        public MyViewHolder(@NonNull View itemView) {
            super(itemView);
            t1= itemView.findViewById(R.id.tvCommnt);
            t2=itemView.findViewById(R.id.tvDesc);
            t3=itemView.findViewById(R.id.tvName);
            t4= itemView.findViewById(R.id.tvStart);
            t5 = itemView.findViewById(R.id.tvEnd);
            view =itemView.findViewById(R.id.tvdele);


        }
        public void  setData(String t01, String t02, String t03, String t05, final int position)
        {
            t1.setText("Task Comment               "+t03);
            t2.setText("Task Description           "+t02);
            t3.setText("Task Name                    "+ t01);
            t4.setText("Start  ");
            t5.setText("Ënd    "+t05);
            view.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    if(onDeleteClickListener!=null)
                    {
                        onDeleteClickListener.OnDeleteClickListener(taskList.get(position));
                        taskList.remove(position);
                        notifyDataSetChanged();
                    }
                }
            });

        }
    }
}
公共类TaskAdapter扩展了RecyclerView.Adapter{
私人语境;
私人名单任务清单;
公共接口OnDeleteClickListener
{
void OnDeleteClickListener(任务);
}
私有OnDeleteClickListener OnDeleteClickListener;
公共任务适配器(上下文上下文,列表任务列表){
this.context=上下文;
this.taskList=任务列表;
}
公共无效设置OnDeleteClickListener(OnDeleteClickListener OnDeleteClickListener){
this.onDeleteClickListener=onDeleteClickListener;
}
@非空
@凌驾
public MyViewHolder onCreateViewHolder(@NonNull ViewGroup父级,int-viewType){
视图;
view=LayoutFlater.from(上下文)。充气(R.layout.view\u task\u列表,父项,false);
MyViewHolder MyViewHolder=新的MyViewHolder(视图);
返回myViewHolder;
}
@凌驾
public void onBindViewHolder(@NonNull MyViewHolder,int位置){
holder.setData(taskList.get(position).getTask_name(),taskList.get(position).getTask_desc(),taskList.get(position).getComment(),taskList.get(position).getTask_comp_date(),position);
}
@凌驾
public int getItemCount(){
返回taskList.size();
}
类MyViewHolder扩展了RecyclerView.ViewHolder{
私有文本视图t1、t2、t3、t4、t5;
私有图像视图;
公共MyViewHolder(@NonNull View itemView){
超级(项目视图);
t1=itemView.findViewById(R.id.tvCommnt);
t2=itemView.findViewById(R.id.tvDesc);
t3=itemviewbyd(R.id.tvName);
t4=itemView.findViewById(R.id.tvStart);
t5=itemView.findViewById(R.id.tvEnd);
视图=itemView.findViewById(R.id.tvdele);
}
公共void setData(字符串t01、字符串t02、字符串t03、字符串t05、最终整数位置)
{
t1.setText(“任务注释”+t03);
t2.setText(“任务描述”+t02);
t3.setText(“任务名称”+t01);
t4.setText(“开始”);
t5.setText(“Ënd”+t05);
view.setOnClickListener(新的view.OnClickListener(){
@凌驾
公共void onClick(视图v){
如果(onDeleteClickListener!=null)
{
onDeleteClickListener.onDeleteClickListener(taskList.get(position));
任务列表。删除(位置);
notifyDataSetChanged();
}
}
});
}
}
}
MainActivity.java:

  public class MainActivity extends AppCompatActivity {

       private RecyclerView recyclerView;
       ImageView imageView;
       @Override
       protected void onCreate(Bundle savedInstanceState) {
           super.onCreate(savedInstanceState);
           setContentView(R.layout.activity_main);
           imageView = findViewById(R.id.ivAdd);
           recyclerView = findViewById(R.id.rvTask);
           imageView.setOnClickListener(new View.OnClickListener() {
               @Override
               public void onClick(View v) {
                   startActivity(new Intent(getApplicationContext(), AddTaskActivity.class));
               }
           });
           new newTask().execute();
       }

class newTask extends AsyncTask<Void,Void, List<Task>> implements TaskAdapter.OnDeleteClickListener {
    List<Task> tasks;
    @Override
    protected List<Task> doInBackground(Void... voids) {

         tasks = DatabaseClient.getInstance(getApplicationContext()).getAppDataBase().taskDao().getAll();

        return  tasks;
    }

    @Override
    protected void onPostExecute(List<Task> tasks) {
        super.onPostExecute(tasks);
        TaskAdapter taskAdapter = new TaskAdapter(MainActivity.this,tasks);
        LinearLayoutManager layoutManager = new LinearLayoutManager(MainActivity.this);
        recyclerView.setLayoutManager(layoutManager);
        recyclerView.addItemDecoration(new DividerItemDecoration(getApplicationContext(),DividerItemDecoration.VERTICAL));
        recyclerView.setAdapter(taskAdapter);
        taskAdapter.setOnDeleteClickListener(this);

    }

    @Override
    public void OnDeleteClickListener(final Task task) {
new Handler().postDelayed(new Runnable() {
    @Override
    public void run() {
        DatabaseClient.getInstance(getApplicationContext()).getAppDataBase().taskDao().delete(task);

    }
},1000);

        }
    }
public类MainActivity扩展了AppCompatActivity{
私人回收站;
图像视图图像视图;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
imageView=findViewById(R.id.ivAdd);
recyclerView=findViewById(R.id.rvTask);
imageView.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
startActivity(新意图(getApplicationContext(),AddTaskActivity.class));
}
});
新建newTask().execute();
}
类newTask扩展AsyncTask实现TaskAdapter.OnDeleteClickListener{
列出任务;
@凌驾
受保护列表背景(无效…无效){
tasks=DatabaseClient.getInstance(getApplicationContext()).getAppDataBase().taskDao().getAll();
返回任务;
}
@凌驾
受保护的void onPostExecute(列出任务){
super.onPostExecute(任务);
TaskAdapter TaskAdapter=新TaskAdapter(MainActivity.this,tasks);
LinearLayoutManager layoutManager=新的LinearLayoutManager(MainActivity.this);
recyclerView.setLayoutManager(layoutManager);
addItemDecoration(新的DividerItemDecoration(getApplicationContext(),DividerItemDecoration.VERTICAL));
recyclerView.setAdapter(taskAdapter);
taskAdapter.setOnDeleteClickListener(此);
}
@凌驾
公共无效OnDeleteClickListener(最终任务){
new Handler().postDelayed(new Runnable()){
@凌驾
公开募捐{
DatabaseClient.getInstance(getApplicationContext()).getAppDataBase().taskDao().delete(任务);
}
},1000);
}
}
欢迎加入stack

您的接口是声明的,但并没有赋值,所以当您单击列表中的项时,您将抛出null指针,但在启动方法接口之前请检查null

首先在适配器中为
OnDeleteClickListener
添加setter

public void setOnDeleteClickListener(OnDeleteClickListener listener){
 this.onDeleteClickListener=listener;
}
并且还添加了当用户单击项目时从列表中删除项目的代码 因此在
setData
方法中更新此代码

    view.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        if (onDeleteClickListener != null) {
            onDeleteClickListener.OnDeleteClickListener(taskList.get(position));
            //remove item from list and then notify adapter data is changed
            taskList.remove(position);
            notifyDataSetChanged();
        }
    }
});
最后,在
AsyncTask
在此处更新您的代码

@Override
 protected void onPostExecute(List < Task > tasks) {
     super.onPostExecute(tasks);
     TaskAdapter taskAdapter = new TaskAdapter(MainActivity.this, tasks, this);
     LinearLayoutManager layoutManager = new LinearLayoutManager(MainActivity.this);
     recyclerView.setLayoutManager(layoutManager);
     recyclerView.addItemDecoration(new DividerItemDecoration(getApplicationContext(), DividerItemDecoration.VERTICAL));
     recyclerView.setAdapter(taskAdapter);

     //pass this that refer to my interface 
     taskAdapter.setOnDeleteClickListener(this);


 }
建议:不要将变量或参数命名为字符串 t01,字符串t02..etc,选择这个变量jop的名称 比如字符串taskComment、字符串taskName..等等

我希望这对你有帮助
@Override
 protected void onPostExecute(List < Task > tasks) {
     super.onPostExecute(tasks);
     TaskAdapter taskAdapter = new TaskAdapter(MainActivity.this, tasks, this);
     LinearLayoutManager layoutManager = new LinearLayoutManager(MainActivity.this);
     recyclerView.setLayoutManager(layoutManager);
     recyclerView.addItemDecoration(new DividerItemDecoration(getApplicationContext(), DividerItemDecoration.VERTICAL));
     recyclerView.setAdapter(taskAdapter);

     //pass this that refer to my interface 
     taskAdapter.setOnDeleteClickListener(this);


 }
AsyncTask.execute(new Runnable() {
    @Override
    public void run() {
        DatabaseClient.getInstance(getApplicationContext()).getAppDataBase().taskDao().delete(task);

    }
});