Java 如何让push()键生成我的Firebase?

Java 如何让push()键生成我的Firebase?,java,android,firebase,firebase-realtime-database,Java,Android,Firebase,Firebase Realtime Database,正如您从图片中看到的,我有一个孩子FreezerItems,在这个孩子下面,我还有另外两个孩子,它们是Firebase使用push()创建的随机键。我的问题是,我如何具体获取密钥L8i2M4wNUF5wOojaFE。另外,如何将该密钥放入我的RecycleServiceAdapter。我试过这个: holder.mDeleteBtn.setOnClickListener(new View.OnClickListener() { @Override public v

正如您从图片中看到的,我有一个孩子
FreezerItems
,在这个孩子下面,我还有另外两个孩子,它们是Firebase使用
push()
创建的随机键。我的问题是,我如何具体获取密钥
L8i2M4wNUF5wOojaFE
。另外,如何将该密钥放入我的
RecycleServiceAdapter
。我试过这个:

holder.mDeleteBtn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            mDatabase = FirebaseDatabase.getInstance().getReference().child("FreezerItems");
            String key = mDatabase.push().getKey();
            Toast.makeText(view.getContext(), key, Toast.LENGTH_SHORT).show();
        }
    });

但所做的只是显示一个带有随机键的土司,每次单击按钮时都会发生变化,事件对象应该包含id,要在读取数据填充时填充项的id,请执行以下操作

   for (DataSnapshot adSnapshot: dataSnapshot.getChildren()) {
        Event eobj = adSnapshot.getValue(Event.class);

                String key = dataSnapshot.getKey();
        eobj.setItemKey(key);
        mDataSet.add(eobj);
   }
使用项目的id,您可以在单击按钮时将其删除。像这样做

FirebaseDatabase.getInstance().getReference()
                    .child("FreezerItems").child(product.getId).removeValue()
                    .addOnCompleteListener(new OnCompleteListener<Void>() {
                        @Override
                        public void onComplete(@NonNull Task<Void> task) {
                            if (task.isSuccessful()) {
                                //remove item from list and refresh recyclerview
                                mDataSet.remove(position);
                                notifyItemRemoved(position);
                                notifyItemRangeChanged(position, mDataSet.size());
                            } else {
                                Log.d("Delete Item", "couldn't be deleted");
                            }
                        }
                    });
FirebaseDatabase.getInstance().getReference()
.child(“冻结项”).child(product.getId).removeValue()
.addOnCompleteListener(新的OnCompleteListener(){
@凌驾
未完成的公共void(@NonNull任务){
if(task.issusccessful()){
//从列表中删除项目并刷新recyclerview
mDataSet.remove(位置);
已移除(位置)的项目;
notifyItemRangeChanged(位置,mDataSet.size());
}否则{
Log.d(“删除项”,“无法删除”);
}
}
});

例如,您可以在代码中看到,您每次单击项目时都会生成一个新id。您没有使用存储在数据库中的id。为了使用已经生成过一次的id,您需要先存储它。为了解决这个问题,我建议您将push()方法提供的随机生成的id存储为模型类的属性。您的数据库结构应如下所示:

Firebase-root
    |
    --- FreezerItems
            |
            --- L8i2M4wNUF5wOojaFE
                      |
                      --- date: "3/31/2018"
                      |
                      --- name: "Ice"
                      |
                      --- freezerItemId: "L8i2M4wNUF5wOojaFE"
然后,要删除该特定项目,请使用以下代码:

DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference freezerItemsRef = rootRef.child("FreezerItems");
holder.mDeleteBtn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            freezerItemsRef.child(freezerItems.getId()).removeValue();
        }
    });

其中,
freezerItems
是模型类的对象,
getId()
是返回该特定id的公共getter。

右键单击recyclerview中的相关项行时,您希望删除firebase中的项。单击行中的按钮时,否。抱歉,回复太晚了。我在冰柜项目下还有一个子项,这是使用push()得到的随机键。如何获得它?它应该是项目数据的一部分,当您获取时需要填充它。for(DataSnapshot-adSnapshot:DataSnapshot.getChildren(){Event-eobj=adSnapshot.getValue(Event.class);String key=dataSnapshot.getKey();eobj.setItemKey(key);mDataSet.add(eobj);}通过setItemKey您是指set_id吗?另外,如果设置为_id,则会显示一个NullPointerException警告谢谢。不过,我还有最后一个问题,当我删除视图时,它会在Firebase中删除,但我必须再次重新加载以查看更改。我该如何解决这个问题?我尝试放置notifyDataSetChanged(),但没有发生任何事情。是的,您需要通知适配器进行特定更改
notifyDataSetChanged()
应该可以解决您的问题。如果您想要另一种显示数据的方式,请参阅如何从Firebase实时数据库检索数据,并使用
FirebaseRecyclerAdapter
将其显示在
RecyclerView
中。它将自动为您处理所有操作。因此,当您添加/删除/更新项目时,适配器将自动刷新。