使用房间数据库添加到收藏夹 [英] Add to favorite using room Database

查看:61
本文介绍了使用房间数据库添加到收藏夹的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我指的是本教程==> https://uniqueandrocode.com/add-to-favourites在我的项目中-re-and-display-favourites-in-recyclerview/中,我具有底部导航...我试图在底部导航栏中的第一个选项卡中添加收藏夹,并在第二个选项卡中显示收藏夹.我正在使用Room库.

I'm referring this tutorial ==> https://uniqueandrocode.com/add-to-favourites-and-display-favourites-in-recyclerview/ in my project I have bottom navigation...I am trying to add favourites in the first tab and displaying favourites in the second tab in the bottom navigation bar. I'm using Room library.

活动加载时,收藏夹一开始都是空白,但是当我将第一行作为收藏夹并转到收藏夹"选项卡时,它会正确显示,但是当我回到第一个选项卡时,它将自动填充所有收藏夹图标(我没有完成,我只完成了第一行)

When activity loads favourites are all blank at first, but when I first row as favourite and go-to favourite tab it displays properly but when I came back to the first tab it fills all the favourites icon automatically (which I have not done I had only done the first row)

真的需要帮助.预先感谢.

Really need help. Thanks in advance.

道:

    @Dao
    public interface FavoriteDao {

    @Insert
    public void addData(FavoriteList favoriteList);

    @Query("select * from favoritelist")
    public List<FavoriteList> getFavoriteData();

    @Query("SELECT EXISTS (SELECT 1 FROM favoritelist WHERE id=:id)")
    public int isFavorite(int id);

    @Delete
    public void delete(FavoriteList favoriteList);

   }

数据库:

    @Database(entities={FavoriteList.class},version = 1)
    public abstract class FavoriteDatabase extends RoomDatabase {

    public abstract FavoriteDao favoriteDao();
    }

收藏夹列表:

    @Entity(tableName="favoritelist")
     public class FavoriteList {


    @PrimaryKey
    private int id;

    @ColumnInfo(name = "source")
    private String source;

    @ColumnInfo(name = "author")
    private String author;

    @ColumnInfo(name = "title")
    private String title;


    @ColumnInfo(name = "description")
    private String description;

    @ColumnInfo(name = "url")
    private String url;
    @ColumnInfo(name = "urlToImage")
    private String urlToImage;
    @ColumnInfo(name = "publishedAt")
    private String publishedAt;

    public int getId() {
        return id;
    }

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

    public String getSource() {
        return source;
    }

    public void setSource(String source) {
        this.source = source;
    }

    public String getAuthor() {
        return author;
    }

    public void setAuthor(String author) {
        this.author = author;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }

    public String getUrl() {
        return url;
    }

    public void setUrl(String url) {
        this.url = url;
    }

    public String getUrlToImage() {
        return urlToImage;
    }

    public void setUrlToImage(String urlToImage) {
        this.urlToImage = urlToImage;
    }

    public String getPublishedAt() {
        return publishedAt;
    }

    public void setPublishedAt(String publishedAt) {
        this.publishedAt = publishedAt;
    }
}

新闻片段:

    public class news extends Fragment {
    ImageView favbtn;
    RecyclerView recyclerView;
    SwipeRefreshLayout swipeRefreshLayout;
    EditText etQuery;
    Button btnSearch;
   
    Adapter adapter;
    List<Articles> articles = new ArrayList<>();
    public static FavoriteDatabase favoriteDatabase;


    public news() {
        // Required empty public constructor
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        View view = inflater.inflate(R.layout.fragment_news, container, false);
        swipeRefreshLayout = view.findViewById(R.id.swiprefresh);
        etQuery = view.findViewById(R.id.etQuery);
        btnSearch = view.findViewById(R.id.btnSearch);

        favoriteDatabase= Room.databaseBuilder(getActivity(),FavoriteDatabase.class,"myfavdb").
                allowMainThreadQueries().build();


        recyclerView = view.findViewById(R.id.recyclerview);
        recyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
        final String country = getCountry();

        retrieveJson("", country, API_Key);

        btnSearch.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (!etQuery.getText().toString().equals("")) {
                    swipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
                        @Override
                        public void onRefresh() {
                            retrieveJson(etQuery.getText().toString(), country, API_Key);
                        }
                    });
                    retrieveJson(etQuery.getText().toString(), country, API_Key);
                } else {

                    swipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
                        @Override
                        public void onRefresh() {
                            retrieveJson("", country, API_Key);
                        }
                    });
                    retrieveJson("", country, API_Key);

                }
            }
        });
        return view;
    }

    private void showChangeLanguageDialog() {

    }

    public void retrieveJson(String query, String country, String apiKey) {

        swipeRefreshLayout.setRefreshing(true);
        Call<Headlines> call;
        if (!etQuery.getText().toString().equals("")) {
            call = ApiClient.getInstance().getApi().getSpecifiedData(query, apiKey);
        } else {
            call = ApiClient.getInstance().getApi().getHeadLines(country, apiKey);

        }


        call.enqueue(new Callback<Headlines>() {
            @Override
            public void onResponse(Call<Headlines> call, Response<Headlines> response) {
                if (response.isSuccessful() && response.body().getArticles() != null) {
                    swipeRefreshLayout.setRefreshing(false);
                   // articles.clear();
                    articles = response.body().getArticles();
                    adapter = new Adapter(getContext(), articles);
                    recyclerView.setAdapter(adapter);
                }
            }

            @Override
            public void onFailure(Call<Headlines> call, Throwable t) {
                swipeRefreshLayout.setRefreshing(false);
                Toast.makeText(getContext(), t.getLocalizedMessage(), Toast.LENGTH_SHORT).show();
            }
        });

    }

    public String getCountry() {
        Locale locale = Locale.getDefault();
        String country = locale.getCountry();
        return country.toLowerCase();


    }

}

适配器:

    public class Adapter extends RecyclerView.Adapter<Adapter.ViewHolder> {
    Context context;
    List<Articles> articles;

    public Adapter(Context context, List<Articles> articles) {
        this.context = context;
        this.articles = articles;
    }

    @NonNull
    @Override
    public Adapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item, parent, false);
        return new ViewHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull final Adapter.ViewHolder holder, final int position) {
      final Articles a = articles.get(position);

        String imageUrl = a.getUrlToImage();
        String url = a.getUrl();

           holder.tvTitle.setText(a.getTitle());
        Picasso.get().load(imageUrl).into(holder.imageView);



        holder.tvSource.setText(a.getSource().getName());
        holder.tvDate.setText(dateTime(a.getPublishedAt()));

        holder.cardView.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        Intent intent = new Intent(context,DetailedActivity.class);
        intent.putExtra("title",a.getTitle());
        intent.putExtra("source",a.getSource().getName());
        intent.putExtra("time",dateTime(a.getPublishedAt()));
        intent.putExtra("desc",a.getDescription());
        intent.putExtra("imageUrl",a.getUrlToImage());
        intent.putExtra("url",a.getUrl());
        context.startActivity(intent);
           }
       });

        if (news.favoriteDatabase.favoriteDao().isFavorite(articles.get(position).getId())==1)
        holder.bookmark.setImageResource(R.drawable.ic_bookmark);
        else
            holder.bookmark.setImageResource(R.drawable.ic_baseline_bookmark_border_24);


        holder.bookmark.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                FavoriteList favoriteList = new FavoriteList();
                int id = articles.get(position).getId();
                String source = articles.get(position).getSource().getName();
                String author = articles.get(position).getAuthor();
                String publishedAt = articles.get(position).getPublishedAt();
                String description = articles.get(position).getDescription();
                String title = articles.get(position).getTitle();
                String url = articles.get(position).getUrl();
                String urlToImage = articles.get(position).getUrlToImage();
                 favoriteList.setId(id);
                favoriteList.setAuthor(author);
                favoriteList.setDescription(description);
                favoriteList.setSource(source);
                favoriteList.setPublishedAt(publishedAt);
                favoriteList.setTitle(title);
                favoriteList.setUrl(url);
                favoriteList.setUrlToImage(urlToImage);
                favoriteList.setPublishedAt(dateTime(articles.get(position).getPublishedAt()));

                if (news.favoriteDatabase.favoriteDao().isFavorite(id)!=1){
                    holder.bookmark.setImageResource(R.drawable.ic_bookmark);
                    news.favoriteDatabase.favoriteDao().addData(favoriteList);

                }else {    
                    holder.bookmark.setImageResource(R.drawable.ic_baseline_bookmark_border_24);
                    news.favoriteDatabase.favoriteDao().delete(favoriteList);
                }
            }
        });
    }

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

    public class ViewHolder extends RecyclerView.ViewHolder {
        TextView tvTitle, tvSource, tvDate;
        ImageView imageView;
        ImageButton bookmark;
        CardView cardView;

        public ViewHolder(@NonNull View itemView) {
            super(itemView);
            tvTitle = itemView.findViewById(R.id.tvId);
            tvSource = itemView.findViewById(R.id.tvSource);
            tvDate = itemView.findViewById(R.id.tvDate);
            imageView = itemView.findViewById(R.id.image);
            cardView = itemView.findViewById(R.id.cardView);
            bookmark = itemView.findViewById(R.id.favrr);
        }
    }

推荐答案

调试步骤:

  1. 添加2-3个收藏夹.
  2. 重新启动应用程序.重新启动应用程序后,检查是否将这些项目显示为收藏.

还可以在要更改可绘制对象的条件下添加日志.

also add logs to those if conditions where you are changing the drawables.

查看了JSON之后,看起来id就是造成问题的原因.对于您所有的json项目,id为null,因此当收藏时.它显示收藏夹之一.所有人.

After looking at your JSON it looks like id is what creating problems. Id is null for all your json items so when fav. one it shows fav. to all.

解决方案:在另一个字段中检查数据是否已添加到fav.list

Solution : Use another field to check if the data is added to fav.list

删除也将不起作用试试

@Query("DELETE FROM favoritelist WHERE title = :title")
void deleteByUserId(String title);

要删除项目

https://github.com/amitshekhariitbhu/Android-Debug-Database

检查此库以调试数据库

这篇关于使用房间数据库添加到收藏夹的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆