【问题标题】:Room Database showing wrong data after deleting item删除项目后房间数据库显示错误数据
【发布时间】:2020-04-07 16:44:18
【问题描述】:

我在我的应用程序中使用房间数据库。该应用程序在所有书籍、家庭书籍和图书馆书籍三个类别下显示书籍。该应用程序根据用户选择显示书籍数据。一切正常,该应用程序显示正确的类别书籍,但是当用户从任何类别中删除一本书时,应用程序和列表会刷新,然后有时应用程序会显示错误的数据,这意味着如果用户正在查看家庭图书类别下的图书并且他删除了一本书,那么应用程序会向他显示随机图书而不是显示他选择的图书家庭书籍。 // 这就是我加载数据的方式:

 public void loadBooks(){
        if(booksType==1){
                    mBookViewModel.getAllBooks().observe(this, new Observer<List<Books>>() {
                        @Override
                        public void onChanged(@Nullable final List<Books>books) {
                                                 adapter.setBooks(books);
                        }
                    });
                }
     if(booksType==2){
                    mBookViewModel.getHomeBooks().observe(this, new Observer<List<Books>>() {
                        @Override
                        public void onChanged(@Nullable final List<Books>books) {
                            // Update the cached copy of the words in the adapter.
                            adapter.setBooks(books);
                        }
                    });
                }
     if(booksType==3){
                    mBookViewModel.getLibrarayBooks().observe(this, new Observer<List<Books>>() {
                        @Override
                        public void onChanged(@Nullable final List<Books>books) {
                            // Update the cached copy of the words in the adapter.
                            adapter.setBooks(books);
                        }
                    });
                }
    calculateSum();// calculating sum of values of a column.
    }

    public void calculateSum(){
    double total=mBookViewModel.getBookSum();
    }

  //  This how I am deleting a book:
    public void delete(Books book){


                   int rowsDeleted = mBookViewModel.deleteBook(book);


           loadBooks(); //have to call this method as I am doing other stuff also.Like calculating the sum of other integer fields.
    // suppose user is viewing Home Books(means bookType==2) after this call instead of showing user Home Books the app shows him any random list of books.It does not happen always but after user deletes five to six books continuously and fast.


    }

  //  My View Model:
      LiveData<List<Books>> getAllBooks() {return mRepository.getAllBooks(); }
     LiveData<List<Books>> getHomeBooks() {return mRepository.getHomeBooks(); }
     LiveData<List<Books>> getLibraryBooks() {return mRepository.getLibraryBooks(); }

     double getBookSum() {return mRepository.getBookSum(); }

  //  Repository:
      LiveData<List<Books>> getallBooks() {
            try {
                return new getAllBooksAsyncTask(mBooksDao).execute().get();
            } catch (ExecutionException e) {
                e.printStackTrace();
                return null;
            } catch (InterruptedException e) {
                e.printStackTrace();
                return null;
            }
        }

      private static class getAllBooksAsyncTask extends AsyncTask<Void, Void, LiveData<List<Books>>> {
            private BooksDao mAsyncTaskDao;


            getAllBooksAscAsyncTask(BooksDao dao) {
                mAsyncTaskDao = dao;
            }

            @Override
            protected LiveData<List<Books>> doInBackground(Void... voids) {
                return mAsyncTaskDao.getAllBooks();
            }
        }

     LiveData<List<Books>> getallBooks() {
            try {
                return new getAllBooksAsyncTask(mBooksDao).execute().get();
            } catch (ExecutionException e) {
                e.printStackTrace();
                return null;
            } catch (InterruptedException e) {
                e.printStackTrace();
                return null;
            }
        }

      private static class getHomeBooksAsyncTask extends AsyncTask<Void, Void, LiveData<List<Books>>> {
            private BooksDao mAsyncTaskDao;


            getHomeBooksAscAsyncTask(BooksDao dao) {
                mAsyncTaskDao = dao;
            }

            @Override
            protected LiveData<List<Books>> doInBackground(Void... voids) {
                return mAsyncTaskDao.getHomeBooks();
            }
        }

     LiveData<List<Books>> getallBooks() {
            try {
                return new getAllBooksAsyncTask(mBooksDao).execute().get();
            } catch (ExecutionException e) {
                e.printStackTrace();
                return null;
            } catch (InterruptedException e) {
                e.printStackTrace();
                return null;
            }
        }

      private static class getLibraryBooksAsyncTask extends AsyncTask<Void, Void, LiveData<List<Books>>> {
            private BooksDao mAsyncTaskDao;


            getLibraryBooksAscAsyncTask(BooksDao dao) {
                mAsyncTaskDao = dao;
            }

            @Override
            protected LiveData<List<Books>> doInBackground(Void... voids) {
                return mAsyncTaskDao.getLibraryBooks();
            }
        }

      public double getBookSum() {
            try {
                return new getBookSumAsyncTask(mBookDao).execute().get();
            } catch (ExecutionException e) {
                e.printStackTrace();
                return 0;
            } catch (InterruptedException e) {
                e.printStackTrace();
                return 0;
            }
        }

      private static class getBookSumAsyncTask extends AsyncTask<Void, Void, Double> {

            private BookDao mAsyncTaskDao;

            getBookSumAsyncTask(BookDao dao) {
                mAsyncTaskDao = dao;
            }

            @Override
            protected Double doInBackground(Void... voids) {
                return mAsyncTaskDao.getBookSum();

            }
        }

 //   Dao:
       @Query("SELECT * FROM books WHERE type  = 1 ")
        LiveData<List<Books>> getAllBooks();

      @Query("SELECT * FROM books WHERE type  = 2 ")
        LiveData<List<Books>> getHomeBooks();

      @Query("SELECT * FROM books WHERE type  = 3 ")
        LiveData<List<Books>> getLibraryBooks();

      @Query("SELECT SUM(pages) FROM books ")
        double getBookSum();


 //   Recycler View:
      @Override
        public void onBindViewHolder(@NonNull booksRecyclerAdapter.BookViewHolder holder, int position) {
            if (mBookss != null) {
              Books current = mBooks.get(position);


                String name = current.getName();


                holder.nameTextView.setText(name);

            }
        }
     void setBooks(List<Books> book){
            mBooks = book;
            notifyDataSetChanged();
        }
       @Override
        public int getItemCount() {
            if (mBooks != null)
                return mBooks.size();
            else return 0;
        }
        public Books getBookAtPosition (int position) {
            return mBooks.get(position);
        }

我尝试添加 adapter.notifyDataSetChanged() 和 adapter.notifyItemRemoved(position);但它不起作用。另外,如果我的代码有问题,那么为什么它并不总是发生,它有时通常在连续删除五六个项目后发生。 非常感谢任何帮助。

【问题讨论】:

  • 您好,在您删除一本书,然后关闭并重新打开您的应用程序后会发生什么,它是否显示正确的列表而没有删除的书或仍然有问题?
  • 当我关闭并重新打开应用程序时,应用程序会显示正确的数据。只有当用户根据 bookType 的值过滤数据然后编辑或删除一本书时,应用程序才会显示用户之前选择的 bookType 而是显示随机数据。而且它并不总是发生。我认为在重新加载数据时应用程序没有正确读取 bookType 的值。

标签: android android-recyclerview android-room android-viewmodel


【解决方案1】:

经过多次尝试,我发现问题出在适配器上。适配器正在加载以前选择的书籍列表,例如如果用户首先选择 homeBooks,然后选择 allBooks 并对 allBooks 列表中的任何一本书执行删除查询,那么在删除操作之后,适配器不会将用户保留在 allBooks 列表中,而是向他显示 homeBooks 列表。因为我对所有三种情况都使用了相同的适配器。我认为这可能是房间数据库的问题。所以,当我对不同的情况使用不同的适配器时,一切都按预期工作。我不知道这是否是正确的方法它但现在它正在工作。所以代码现在变成了

 public void loadBooks(){
        if(booksType==1){
   bookRecyclerAdapter adapter1=new bookRecyclerAdapter(this);
        recyclerView.setAdapter(adapter1);
                    mBookViewModel.getAllBooks().observe(this, new Observer<List<Books>>() {
                        @Override
                        public void onChanged(@Nullable final List<Books>books) {
                                                 adapter1.setBooks(books);
                        }
                    });
                }
     if(booksType==2){
  bookRecyclerAdapter adapter2=new bookRecyclerAdapter(this);
        recyclerView.setAdapter(adapter2);
                    mBookViewModel.getHomeBooks().observe(this, new Observer<List<Books>>() {
                        @Override
                        public void onChanged(@Nullable final List<Books>books) {
                            // Update the cached copy of the words in the adapter.
                            adapter2.setBooks(books);
                        }
                    });
                }
     if(booksType==3){
  bookRecyclerAdapter adapter3=new bookRecyclerAdapter(this);
        recyclerView.setAdapter(adapter3);
                    mBookViewModel.getLibrarayBooks().observe(this, new Observer<List<Books>>() {
                        @Override
                        public void onChanged(@Nullable final List<Books>books) {
                            // Update the cached copy of the words in the adapter.
                            adapter3.setBooks(books);
                        }
                    });
                }
    calculateSum();// calculating sum of values of a column.
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-05-20
    • 2019-12-05
    • 1970-01-01
    • 2020-09-16
    • 2021-08-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多