Firebase添加fab按钮无法删除条目的问题

时间:2018-10-03 19:03:09

标签: java android firebase firebase-realtime-database onclicklistener

当前,在此活动的detailView底部有一个浮动动作,我将带意图的Object信息带入。我希望当用户进入detailView活动时,如果收藏夹节点中已经存在Automoviles objectId,我会充满信心。如果不将信息添加到数据库中。如果该收藏夹已经存在,并且如果用户再次单击该收藏夹,则它将充满心脏。

这是我最喜欢的课程:

public class Favorites {

private String id;
private  String automovilesId;
private  String userId;
private String fecha;

public Favorites() {
}

public Favorites(String automovilesId, String userId, String fecha) {
    this.automovilesId = automovilesId;
    this.userId = userId;
    this.fecha = fecha;
}

public String getId() {
    return id;
}

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

public String getAutomovilesId() {
    return automovilesId;
}

public void setAutomovilesId(String automovilesId) {
    this.automovilesId = automovilesId;
}

public String getUserId() {
    return userId;
}

public void setUserId(String userId) {
    this.userId = userId;
}

public String getFecha() {
    return fecha;
}

public void setFecha(String fecha) {
    this.fecha = fecha;
}
}

此刻我有以下代码:

        databaseReference = FirebaseDatabase.getInstance().getReference(AppModel.Favorites);
    favoritesButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
            final DatabaseReference usersRef = rootRef.child("Favorites");
            favorites = new Favorites(automoviles.getObjectId(), user.getUid(), AppModel.GetDate());
            databaseReference.push().setValue(favorites);
        }
    });

哪个在数据库中领导此条目:

Firebase Data

这一切都很好,但我还需要验证数据库中是否存在收藏夹,否则每次运行android仿真器时,它将创建另一个收藏夹节点。

现在,我添加了更多代码。但是,当我运行它并添加此AddFavorite方法时,它将在数据库中创建收藏夹节点的无限循环

    databaseReference = FirebaseDatabase.getInstance().getReference(AppModel.Favorites);
    favoritesButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
            final DatabaseReference usersRef = rootRef.child("Favorites");
            favorites = new Favorites(automoviles.getObjectId(), user.getUid(), AppModel.GetDate());
            databaseReference.push().setValue(favorites);


            usersRef.addValueEventListener(new ValueEventListener() {
                @Override
                public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                    for(DataSnapshot ds : dataSnapshot.getChildren()) {
                        String car = ds.child("automovilesId").getValue(String.class);
                        Favorites fav =ds.getValue(Favorites.class);
                        String carId =fav.getAutomovilesId();
                        Log.i("No","Este es el nombre------>:"+carId);
                        String id=ds.getKey();
                        AddFavoritesuser();
                    }

                }

                @Override
                public void onCancelled(@NonNull DatabaseError databaseError) {

                }
            });

        }
    });

这是AddFavorite方法和delete方法:

 private void AddFavoritesuser() {
    favoritesButton.setImageResource(R.drawable.ic_favorite);
    favorites = new Favorites(automoviles.getObjectId(), user.getUid(), AppModel.GetDate());
    databaseReference.push().setValue(favorites);
}

删除:

private void deleteFavoritesUser(String key) {
    favoritesButton.setImageResource(R.drawable.ic_favorite_border);
    databaseReference.child(key).getRef().removeValue();

}

简而言之,我要它验证Automoviles对象的那个对象是否存在。如果存在,则用户进入并看到填充的心,如果他想删除此收藏夹,则再次单击,它将运行deleteFavoritesUser方法。但是我的问题是,如果仍未在数据库中创建收藏夹,该如何验证呢?。

我再次运行了该应用程序,并再次创建了一个相同的标签:

As you can see I have the same automovilesId entry

2 个答案:

答案 0 :(得分:0)

基本上,您需要将自己喜欢的按钮设置为切换按钮

favoritesButton.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        // in place of YES/NO you can take any values to present true/false state
        boolean status = v.getTag() != null ? v.getTag().equals("YES") : false;
        v.setTag(status ? "NO" : "YES");
        if (status) {
            // Do favorite me
            //AddFavoritesuser();
        } else {
            // Do un favorite me
            //deleteFavoritesUser(key);
        }
    }
}

答案 1 :(得分:0)

  

每次我运行android仿真器时,都会创建另一个收藏夹节点。

之所以发生这种情况,是因为每次尝试向数据库中添加globalOffset类的新对象时,您都在使用Favorites方法,该方法每次都会生成一个新的随机密钥。这就是这种方法的作用。因此,为了从数据库中检查属性,您需要在引用中使用相同的键,来生成另一个。请在我的 post 答案中看到,我在其中解释了如何实现此目标。