Java 在firebase android中保存一个父项下的多个子项
我在onDataChange()方法中尝试了下面的代码来保存firebase存储中的项目单击,并且我正在尝试将项目添加到购物车中的单个用户下,该用户的购物车中可以有许多项目(作为子项)。 但问题是push()会在父id下生成新id,并执行无限循环,在单击项目时无限次保存项目。如果没有push(),购物车中的项目将替换为新项目。我想将这些项目作为子项添加到登录的同一用户下。我是firebase和android的新手,所以请在这里帮助我。 我还提供了保存在firebase中的数据的屏幕截图,当我单击一个项目时,它会将该项目无限次保存到firebase中Java 在firebase android中保存一个父项下的多个子项,java,android,firebase,firebase-realtime-database,shopping-cart,Java,Android,Firebase,Firebase Realtime Database,Shopping Cart,我在onDataChange()方法中尝试了下面的代码来保存firebase存储中的项目单击,并且我正在尝试将项目添加到购物车中的单个用户下,该用户的购物车中可以有许多项目(作为子项)。 但问题是push()会在父id下生成新id,并执行无限循环,在单击项目时无限次保存项目。如果没有push(),购物车中的项目将替换为新项目。我想将这些项目作为子项添加到登录的同一用户下。我是firebase和android的新手,所以请在这里帮助我。 我还提供了保存在firebase中的数据的屏幕截图,当我单击
private void getDetailedItem(final String itemId)
{
items.child(itemId);
items.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot)
{
for(DataSnapshot datas: dataSnapshot.getChildren())
{
if(pos.equals(datas.getKey().toString()))
{
try {
item = dataSnapshot.getValue(Items.class);
cart_item_name = datas.child("title").getValue().toString();
cart_item_amount = datas.child("amount").getValue().toString();
image_view_cart = datas.child("image").getValue().toString();
Toast.makeText(CartActivity.this, "Data setting",
Toast.LENGTH_SHORT).show();
item.setTitle(cart_item_name);
item.setAmount(cart_item_amount);
item.setImage(image_view_cart);
Items uploadUser = new Items();
uploadUser.setTitle(cart_item_name);
uploadUser.setAmount(cart_item_amount);
uploadUser.setImage(image_view_cart);
if(mFirebaseAuth.getCurrentUser()!=null){
items.child("UserNode").child(mFirebaseAuth.getCurrentUser().getUid()).setValue(
item, new DatabaseReference.CompletionListener() {
@Override
public void onComplete(DatabaseError databaseError, DatabaseReference databaseReference) {
if (databaseError == null) {
Toast.makeText(CartActivity.this, "Data is saved successfully",
Toast.LENGTH_SHORT).show();
}
}
});
addToCartItems.add(item);
cartRecyclerAdapter.notifyDataSetChanged();
}
catch (Exception e)
{
e.printStackTrace();
}
}
}
updateAdapterData();
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {}
});
}
您的问题不清楚,但据我所知,您正在尝试制作一个购物车,登录用户可以在其中添加和删除项目,并将其存储在firebase数据库中以备将来使用 首先,如果要获取特定项目的详细信息,请使用
addListenerForSingleValueEvent
其次,在获得完成回调后调用NotifyAdapter。因此调用cartRecyclerAdapter.notifyDataSetChanged()代码>内部onComplete()
添加活动或片段的完整代码。我相信您已经在引用中添加了ValueEventListener,然后您正在将新值推送到侦听器中。这将使它运行无限次。是的,谢谢,你是对的,我在addValueEventListener()中有这段代码现在请更正它,因为我已经更新了上面的代码。请添加您的数据库结构并记录您要添加到购物车中的项目。我已经将数据存储到firebase中,现在请帮助我这里的错误。@mark922请帮助我实现我的目标,因为我从上一个4月开始就一直在努力解决这个问题天。谢谢,您提供的更改对我起到了作用,通过添加push(),我正确地实现了每件物品的存储:)
private void getDetailedItem(final String itemId)
{
items.child(itemId);
items. addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot)
{
for(DataSnapshot datas: dataSnapshot.getChildren())
{
if(pos.equals(datas.getKey().toString()))
{
try {
item = dataSnapshot.getValue(Items.class);
cart_item_name = datas.child("title").getValue().toString();
cart_item_amount = datas.child("amount").getValue().toString();
image_view_cart = datas.child("image").getValue().toString();
Toast.makeText(CartActivity.this, "Data setting",
Toast.LENGTH_SHORT).show();
item.setTitle(cart_item_name);
item.setAmount(cart_item_amount);
item.setImage(image_view_cart);
Items uploadUser = new Items();
uploadUser.setTitle(cart_item_name);
uploadUser.setAmount(cart_item_amount);
uploadUser.setImage(image_view_cart);
if(mFirebaseAuth.getCurrentUser()!=null){
items.child("UserNode").child(mFirebaseAuth.getCurrentUser().getUid()).setValue(
item, new DatabaseReference.CompletionListener() {
@Override
public void onComplete(DatabaseError databaseError, DatabaseReference databaseReference) {
if (databaseError == null) {
addToCartItems.add(item);
cartRecyclerAdapter.notifyDataSetChanged();
Toast.makeText(CartActivity.this, "Data is saved successfully",
Toast.LENGTH_SHORT).show();
}
}
});
}
catch (Exception e)
{
e.printStackTrace();
}
}
}
updateAdapterData();
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {}
});
}