【问题标题】:Problem with Firebase adding a fab button cant delete entryFirebase添加fab按钮无法删除条目的问题
【发布时间】:2018-10-03 19:03:08
【问题描述】:

目前,在此活动中,我的 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 方法。但我的问题是,如果收藏夹仍然没有在数据库中创建,我该如何验证呢?

我再次运行该应用程序并再次创建了相同的 vale:

As you can see I have the same automovilesId entry

【问题讨论】:

  • 这是由于 addValueEventListener 而发生的,每当您在 firebase 集合中添加某些内容时,它都会不断调用。理想情况下,您不需要从 onDataChange 方法插入。
  • 那么我将如何检查数据库中是否已经存在 automovilesId? @KrishnaSharma
  • 您已经在侦听器范围之外执行此操作,因此您只需从 onDataChange 注释掉这行代码 //AddFavoritesuser();
  • 那么我应该如何做我需要验证它是否存在的所有其他事情,放置彩色心形图标,如果用户再次单击,它将从数据库中删除该收藏夹并放置边框心形。 @KrishnaSharma
  • 基本上你需要把你喜欢的按钮做成一个切换按钮

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


【解决方案1】:

基本上你需要把你最喜欢的按钮做成一个切换按钮

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);
        }
    }
}

【讨论】:

  • 发生了什么??应该工作......你在 recyclerView 的某个地方使用吗?
  • 因为这不会检查数据库中是否存在automovilesId
【解决方案2】:

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

发生这种情况是因为每次您尝试将Favorites 类的新对象添加到数据库时,您都在使用push() 方法,该方法在每次调用时都会生成一个新的随机密钥。这就是这个方法的作用。因此,为了从数据库中检查属性,您需要在引用中使用相同的键,not 来生成另一个键。请参阅我对 post 的回答,我已经解释了如何实现这一目标。

【讨论】:

  • 嗨菲利普!你有没有试过我上面的解决方案,它有效吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-20
  • 1970-01-01
  • 2018-01-27
  • 1970-01-01
  • 2019-08-27
  • 1970-01-01
  • 2017-05-19
相关资源
最近更新 更多