使用房间库实现收藏夹列表

Implement favorites list with room library

我想为一个使用房间图书馆的新闻应用程序实现一个用户最喜欢的新闻列表,但是应用程序崩溃了

感谢您的帮助(:

数据库:

我放不下代码,我用的是照片: enter image description here

道:

@Dao
public interface DataDao {
    
    @Insert
    void insert_list_fav(FavModel favModel);

    @Delete
    void delete_fav(FavModel favModel);
    

    @Query("SELECT * FROM tbl_fav")
    LiveData<List<FavModel>> getFavList();

    @Query("SELECT EXISTS (SELECT 1 FROM tbl_fav WHERE id=:id)")
    int isFav(int id);
    
}

适配器新闻:

    @Override
    public void onBindViewHolder(@NonNull Holder holder, int position) {
        LastNewsModel model= dataModels.get(position);
        

        ///////It is added to the list here

        holder.save.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                FavModel favModel=new FavModel();

                int id=model.getId();
                String title=model.getTitle();
                String desc=model.getDescription();
                String pic=model.getPic();
                String date=model.getDate();

                favModel.setId(id);
                favModel.setTitle(title);
                favModel.setDate(date);
                favModel.setDescription(desc);
                favModel.setPic(pic);

                if (DataBase.getDataBase(context).getDao().isFav(id)!=1){
                    holder.save.setImageResource(R.drawable.ic_saved);
                    DataBase.getDataBase(context).getDao().insert_list_fav(favModel);
                }else {
                    holder.save.setImageResource(R.drawable.ic_save);
                    DataBase.getDataBase(context).getDao().delete_fav(favModel);
                }

            }
        });

    }

错误:

enter image description here

尝试使用thread或者Asyc。

简单示例

Thread thread = new Thread() {  
    @Override
    public void run() {
        try {
            //your code 
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
};
thread.start();

这是因为您正尝试在主线程上执行数据库事务,这有时会很繁重,具体取决于情况,这就是为什么最好使用后台线程来执行此类任务。

为什么会这样

UI 或主线程用于显示 UI 您的用户可以在何处与您的应用进行交互。因此从数据库加载数据等内容有时会非常繁重,最终会冻结,或者就 android 而言,它可能会显示 ANR(应用程序无响应),这不是很好的用户体验,因此请使用 [= 以外的其他线程21=] 做繁重的线程阻塞任务。

there are multiple ways to do this stuff

  • Executors
  • Threads
  • AsyncTasks (As of API 30 it's been deprecated)
  • Coroutines (only using kotlin)

例如

....

ExecutorService executor = Executors.newSingleThreadExecutor();
    
Handler handler = new Handler(Looper.getMainLooper()); // this will allow access to Main Thread.
    
executor.execute(new Runnable() {
    @Override
    public void run() {
        if (DataBase.getDataBase(context).getDao().isFav(id)!=1){
                handler.post(() -> holder.save.setImageResource(R.drawable.ic_saved));
                DataBase.getDataBase(context).getDao().insert_list_fav(favModel);
        } else {
                handler.post(() -> holder.save.setImageResource(R.drawable.ic_save));
                DataBase.getDataBase(context).getDao().delete_fav(favModel);
        }
    }
});

....