CRUD комнаты в Java android, как вернуть количество удаленных строк из Dao и AsyncTask в Ripository через viewmodel обратно в CatalogActivity? - PullRequest
2 голосов
/ 03 июля 2019

Я пытаюсь разработать это небольшое приложение для выполнения операций CRUD с использованием Room, Repository, LiveData, ViewModel и Listview, если вы хотите увидеть разработку приложения или строку коммитаJava, здесь, в этом моем репозитории github

Исходное приложение, которое называется Pets at , в оригинальном репозитории Pets разработано с использованием ContentProvider и ContentResolver вподкласс SQLiteOpenHelper в Android с Java


вопрос

Небольшое приложение для Android в Java для выполнения операций CRUD Room, Repository, LiveDataи ViewModel и Listview, как вернуть количество удаленных строк из Dao и AsyncTask в репозитории через ViewModel обратно в CatalogActivity?

Это то, что в PetDao.java

@Query("DELETE FROM pets")
int deleteAllPets();

Это то, что в PetRepository.java

// this class is inside repository
    private static class DeleteAllPetsAsyncTask extends AsyncTask<Void, Void, Integer>
    {
        private PetDao petDaoOfDeleteAllAsyncTask;

        DeleteAllPetsAsyncTask(PetDao petDao)
        {
            this.petDaoOfDeleteAllAsyncTask = petDao;
        }

        @Override
        protected Integer doInBackground(Void... voids)
        {
            int countOfDeletedRows = this.petDaoOfDeleteAllAsyncTask.deleteAllPets();
            return countOfDeletedRows;
        }

        /**
         * <p>Runs on the UI thread after {@link #doInBackground}. The
         * specified result is the value returned by {@link #doInBackground}.</p>
         *
         * <p>This method won't be invoked if the task was cancelled.</p>
         *
         * @param integer The result of the operation computed by {@link #doInBackground}.
         * @see #onPreExecute
         * @see #doInBackground
         * @see #onCancelled(Object)
         */
        @Override
        protected void onPostExecute(Integer integer) {
            //super.onPostExecute(integer);
            // TODO: how to return this integer
        }
    }

    // this function is inside repository
    public void deleteAllPets()
    {
        new DeleteAllPetsAsyncTask(this.petDao).execute();
    }

Это то, что в PetViewModel.java

public void deleteAllPets()
{
    this.petRepository.deleteAllPets();
}

Это то, что в CatalogActivity.java

    private void deleteAllPets() {
        // TODO: Implement this method
        //
        Log.v(this.LOG_TAG, "rows deleted from pet database count is: ");

        this.petViewModel.deleteAllPets();
        // Show a toast message depending on whether or not the delete was successful.
        if (0 == 0) {
            // If no rows were deleted, then there was an error with the delete.
            Toast.makeText(this, super.getString(R.string.catalog_delete_all_pets_failed) +
                    " ", Toast.LENGTH_LONG).show();
        } else {
            // Otherwise, the delete was successful and we can display a toast.
            Toast.makeText(this, super.getString(R.string.catalog_delete_all_pets_successful) +
                    " ", Toast.LENGTH_LONG).show();
        }
        // Close the activity
        //super.finish();

    }

Я также жду ответа от @EpicPandaForce

Большое спасибо

1 Ответ

1 голос
/ 03 июля 2019

это то, что в PetDao.java

@Query("DELETE FROM pets")
int deleteAllPets();

В вашем PetRepository.java

private static class DeleteAllPetsAsyncTask extends AsyncTask<Void, Void, Integer>
    {
        private PetDao petDaoOfDeleteAllAsyncTask;
        public MutableLiveData<Integer> resultLiveData = new MutableLiveData();

        DeleteAllPetsAsyncTask(PetDao petDao)
        {
            this.petDaoOfDeleteAllAsyncTask = petDao;
        }

        @Override
        protected Integer doInBackground(Void... voids)
        {
            int countOfDeletedRows = this.petDaoOfDeleteAllAsyncTask.deleteAllPets();
            return countOfDeletedRows;
        }

        /**
         * <p>Runs on the UI thread after {@link #doInBackground}. The
         * specified result is the value returned by {@link #doInBackground}.</p>
         *
         * <p>This method won't be invoked if the task was cancelled.</p>
         *
         * @param integer The result of the operation computed by {@link #doInBackground}.
         * @see #onPreExecute
         * @see #doInBackground
         * @see #onCancelled(Object)
         */
        @Override
        protected void onPostExecute(Integer integer) {
            //super.onPostExecute(integer);
            // TODO: how to return this integer
            resultLiveData.postValue(integer);
        }
    }

    // this function is inside repository
    public LiveData<Integer> deleteAllPets()
    {
        DeleteAllPetsAsyncTask task = new DeleteAllPetsAsyncTask(this.petDao);
        task.execute();
        // I edited here
        return task.resultLiveData;
    }

В PetViewModel.java

public LiveData<Integer> deleteAllPets() {
    return this.petRepository.deleteAllPets();
}

В CatalogActivity.java

//
    private void deleteAllPets() {
        // TODO: Implement this method
        //
        Log.v(this.LOG_TAG, "rows deleted from pet database count is: ");

        this.petViewModel.deleteAllPets().observe(this,new Observer<Integer>(){
            @Override
            public void onChanged(final Integer result) {
                // here you will get result
                if (result == 0) {
                    // If no rows were deleted, then there was an error with the delete.
                    Toast.makeText(this, super.getString(R.string.catalog_delete_all_pets_failed) +
                    " ", Toast.LENGTH_LONG).show();
                } else {
                    // Otherwise, the delete was successful and we can display a toast.
                    Toast.makeText(this, super.getString(R.string.catalog_delete_all_pets_successful) +
                    " ", Toast.LENGTH_LONG).show();
                }
               // Close the activity
               //super.finish();
            }
        });
        // Show a toast message depending on whether or not the delete was successful.
    }
...