删除带有Room的行项sqlite时的空对象引用

时间:2019-09-15 15:54:15

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

我使用“房间持久性”,并且在Recycleview上删除一项时遇到问题,当我们在Recycleview上单击btnDelete时,它将出现错误“ Attempt to invoke virtual method 'com.example.submade4.db.FavoriteView com.example.submade4.db.FavoriteDatabase.favoriteView()' on a null object reference”。 这是我的DAO:

@Delete
void deleteFavorite(FavoriteData favoriteData);

这是我的适配器,我已经将查询结果输入到实体(模型),但是仍然存在错误:

import android.widget.Toast;

import com.bumptech.glide.Glide;

import com.example.submade4.CustomOnItemClickListener;
import com.example.submade4.R;
import com.example.submade4.db.FavoriteDatabase;
import com.example.submade4.entity.FavoriteData;


import java.util.ArrayList;


public class AdapterFavorite extends RecyclerView.Adapter<AdapterFavorite.ViewHolder> {
    private ArrayList<FavoriteData> daftarFavorite;
    private Context context;
    private FavoriteActivity favoriteActivity;
    private FavoriteDatabase database;
    private static final String EXTRA_KEY = "KEY";

    AdapterFavorite(ArrayList<FavoriteData> daftarFavorite, Context context) {

        //Inisialisasi data yang akan digunakan
        this.daftarFavorite = daftarFavorite;
        this.context = context;

    }



    class ViewHolder extends RecyclerView.ViewHolder{

        //Deklarasi View yang akan digunakan
        private TextView Judul, release, type;
        private ImageView ivFavorite;
        private ImageButton btnDelete;
        ViewHolder(View itemView) {
            super(itemView);
            Judul = itemView.findViewById(R.id.tv_favorite_name);
            type =itemView.findViewById(R.id.tv_favorite_type);
            release = itemView.findViewById(R.id.tv_item_release);
            ivFavorite = itemView.findViewById(R.id.img_item_favorite);
            btnDelete = itemView.findViewById(R.id.deleteFav);
        }

    }

    @NonNull
    @Override
    public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        //Inisialisasi Layout Item untuk RecyclerView
        View v =  LayoutInflater.from(parent.getContext()).inflate(R.layout.item_recycleview_favorite, parent, false);
        return new ViewHolder(v);
    }

    @Override
    public void onBindViewHolder(@NonNull ViewHolder holder, int i) {

        //Deklarasi Variable untuk mendapatkan data dari Database melalui Array
        String getJudul = daftarFavorite.get(i).getJudul();
        String getRelease = daftarFavorite.get(i).getRelease();
        String fotoUrl = "https://image.tmdb.org/t/p/w342/"+daftarFavorite.get(i).getPath();
        String getType = daftarFavorite.get(i).getType();
        int idS = daftarFavorite.get(i).getId();
        Log.e("Idne : ", String.valueOf(idS));
        //Menampilkan data berdasarkan posisi Item dari RecyclerView
        holder.Judul.setText(getJudul);
        holder.release.setText(getRelease);
        Glide.with(context).load(fotoUrl).into(holder.ivFavorite);
        holder.type.setText(getType);

        FavoriteData favoriteData = new FavoriteData();
        favoriteData.setJudul(daftarFavorite.get(i).getJudul());
        favoriteData.setDeskripsi(daftarFavorite.get(i).getDeskripsi());
        favoriteData.setRelease(daftarFavorite.get(i).getRelease());
        favoriteData.setBahasa(daftarFavorite.get(i).getBahasa());
        favoriteData.setType(daftarFavorite.get(i).getType());
        favoriteData.setPath(daftarFavorite.get(i).getPath());

        holder.btnDelete.setOnClickListener(new CustomOnItemClickListener(i, (view, position) -> {
            FavoriteData favoriteDelete = new FavoriteData();
            favoriteDelete.setJudul(daftarFavorite.get(i).getJudul());
            favoriteDelete.setDeskripsi(daftarFavorite.get(i).getDeskripsi());
            favoriteDelete.setRelease(daftarFavorite.get(i).getRelease());
            favoriteDelete.setBahasa(daftarFavorite.get(i).getBahasa());
            favoriteDelete.setType(daftarFavorite.get(i).getType());
            favoriteDelete.setPath(daftarFavorite.get(i).getPath());
            deleteTask(favoriteDelete);


        }));
        holder.itemView.setOnClickListener(v -> {
            Intent intent = new Intent(context.getApplicationContext(), DetailFavorite.class);
            intent.putExtra(EXTRA_KEY, (Parcelable) favoriteData);
            intent.putExtra("type", "movie");
            context.startActivity(intent);
        });
    }

    @Override
    public int getItemCount() {
        //Menghitung data / ukuran dari Array
        return daftarFavorite.size();
    }

    private void deleteTask(final FavoriteData favoriteData) {
        class DeleteTask extends AsyncTask<Void, Void, Void> {

            @Override
            protected Void doInBackground(Void... voids) {
               database.favoriteView().deleteFavorite(favoriteData);
                return null;
            }

            @Override
            protected void onPostExecute(Void aVoid) {
                super.onPostExecute(aVoid);
                Toast.makeText(context, "Deleted", Toast.LENGTH_LONG).show();
            }
        }

        DeleteTask dt = new DeleteTask();
        dt.execute();

    }
}

这是MyDatabase:

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


    public abstract FavoriteView favoriteView();

}

我尝试了另一种方法,但遇到相同的错误。请帮忙。 谢谢

0 个答案:

没有答案