【问题标题】:Implement favorites list with room library使用房间库实现收藏夹列表
【发布时间】:2021-08-26 08:14:13
【问题描述】:

我想使用房间库为新闻应用程序实现用户最喜欢的新闻列表,但应用程序崩溃

感谢您的帮助(:

数据库:

我无法输入代码,我使用了照片: 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

【问题讨论】:

    标签: java android-studio android-sqlite android-room


    【解决方案1】:

    尝试使用线程或 Asyc。

    简单示例

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

    【讨论】:

      【解决方案2】:

      这是由于您尝试在主线程上执行数据库事务,有时根据情况可能会很繁重,因此最好使用后台线程来执行此类任务。

      为什么会这样

      UI 或主线程用于显示用户可以与您的应用交互的 UI。所以从数据库加载数据之类的东西有时会非常繁重,最终会冻结,或者就 android 而言,它可能会显示 ANR(App Not Responding),这不是很好的用户体验,所以使用 UI 以外的其他线程来执行繁重的线程阻塞任务。

      有多种方法可以做到这一点

      • 执行者
      • 线程
      • AsyncTasks (从 API 30 开始,它已被弃用)
      • 协程 (仅使用 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);
              }
          }
      });
      
      ....
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-02-02
        • 1970-01-01
        • 1970-01-01
        • 2017-10-27
        • 2018-09-04
        相关资源
        最近更新 更多