Android- Como verificar se uma linha já existe numa base de Dados Room

fabiopires1011

Power Member
Boas, estou a desenvolver um projeto e preciso de verificar se uma linha já existe na minha base de dados Room. Basicamente o que quero fazer é ,caso o objeto já exista na base de dados, o botão passa a ser verde e no onClick ele remove esse objeto da bd. Caso ainda não exista, o comportamento deverá ser adicionar o objeto. Já tentei com async tasks(como se pode ver no código abaixo) mas não funcionou. Alguma ideia de como poderei resolver este problema? A linguagem é Java. Em baixo deixo o meu código

Adapter

Código:
public class RestaurantAdapter extends RecyclerView.Adapter<RestaurantAdapter.RestaurantViewHolder> {
    private Context mContext;
    private List<Restaurant_> mRestaurants;
    private Activity act;
    private FirebaseAuth mAuth;
    private String currentUserId;
    private View rView;

    public RestaurantAdapter(Context context, List<Restaurant_> restaurants, Activity activity) {
        mRestaurants = restaurants;
        mContext = context;
        act = activity;
    }

    @Override
    public RestaurantViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        // Get layout inflater from context
        Context context = parent.getContext();
        LayoutInflater inflater = LayoutInflater.from(context);

        // Inflate layout
        rView = inflater.inflate(R.layout.item_restaurant, parent, false);

        // Return a new holder instance
        return new RestaurantViewHolder(rView);
    }

    @Override
    public void onBindViewHolder(RestaurantViewHolder viewHolder, final int position) {

        // Get the data model based on position
        final Activity activity = act;

        final Restaurant_ restaurant = mRestaurants.get(position);

        mAuth = FirebaseAuth.getInstance();
        currentUserId = mAuth.getCurrentUser().getUid();

        final TextView name = viewHolder.nameTextView;
        name.setText(restaurant.getName());

        final TextView rating = viewHolder.ratingTextView;
        rating.setText((restaurant.getUserRating().getAggregateRating()));

        final TextView distance = viewHolder.distanceTextView;
        distance.setText(String.valueOf(restaurant.getDistance()) + " Km");

        final ImageButton addToWishlistButton = viewHolder.addToWishlistButton;
        addToWishlistButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Wishlist wishlist = new Wishlist(currentUserId, restaurant.getId());
                //if(alreadyExists){
                //RemoveWLTask rlt=new RemoveWLTask(wishlist,activity);
                //rlt.execute()
               // }

               // else{
                    AddWLTask wlt = new AddWLTask(wishlist, activity);
                    wlt.execute();
                //}
            }
        });

        final ImageButton addToFavoritesButton = viewHolder.addToFavoritesButton;
        addToFavoritesButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                addToFavoritesButton.getBackground().setTint(activity.getResources().getColor(R.color.red));
                addToFavorites();
            }
        });

        viewHolder.itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                LiveFragment.getListener().onRestaurantClicked(restaurant.getId());
            }
        });
    }

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


    public class RestaurantViewHolder extends RecyclerView.ViewHolder {
        public TextView nameTextView;
        public TextView ratingTextView;Salvar Rascunho
        public TextView distanceTextView;
        public ImageButton addToWishlistButton;
 
        public ImageButton addToFavoritesButton;

        public RestaurantViewHolder(View itemView) {
            super(itemView);
            nameTextView = itemView.findViewById(R.id.restaurantName);
            ratingTextView = itemView.findViewById(R.id.restaurantRating);
            distanceTextView = itemView.findViewById(R.id.restaurantDistance);
            addToWishlistButton = itemView.findViewById(R.id.button_wishlist);
            addToFavoritesButton = itemView.findViewById(R.id.button_favorites);
        }

    }

}

DAO DA MINHA BD

Código:
@Dao
public interface DAO {
    @Insert
    public void addToWishlist(Wishlist wishlist);

    @Delete
    public void deleteFromWishlist(Wishlist wishlist);

    @Query("Select restaurantId From wishlist Where userId=:id")
    public String[] loadWishlist(String id);

    @Query("Select restaurantId From wishlist where userId=:userID AND restaurantId=:restaurantID")
    public String[]checkExists(String userID, String restaurantID);
 
}

ASYNC TASK

Código:
public class CheckWLTask extends AsyncTask<Void, Void, Void> {
    private DB db;
    private Activity activity;
    private String userId;
    private String restaurantId;
    private String [] response;

    public CheckWLTask(Activity activity, String idUser, String idRestaurant) {
        this.activity = activity;
        this.userId = idUser;
        this.restaurantId = idRestaurant;
        db = Room.databaseBuilder(activity.getApplicationContext(), DB.class, "sample-db").build();
    }

    @Override
    protected Void doInBackground(Void... voids) {
        while (!isCancelled()) {
            this.response=db.daoAcess().checkExists(userId,restaurantId);
            break;
        }
        return null;
    }


}



 
assim de cabeça talvez algo assim?


@Query("SELECT EXISTS (SELECT 1 FROM wishlist WHERE userId=:userID AND restaurantId=:restaurantID)")
public boolean checkExists(String userID, String restaurantID);
 
Back
Topo