如何让 push() 密钥生成我的 Firebase?

Posted

技术标签:

【中文标题】如何让 push() 密钥生成我的 Firebase?【英文标题】:How to get the push() key generated my Firebase? 【发布时间】:2018-09-07 21:29:25 【问题描述】:

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

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

但所做的只是显示一个带有随机键的 Toast,每次我点击按钮时都会改变

【问题讨论】:

当recyclerview中相关项目的行被右键点击时,你想删除firebase中的一个项目。 当单击该行中的按钮时没有。抱歉回复晚了 【参考方案1】:

您在代码中所做的是,每次单击项目时都会生成一个新 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。

【讨论】:

非常感谢 我还有最后一个问题,当我删除它在 Firebase 中删除的视图时,我必须重新加载它才能看到更改。我该如何解决?我尝试放置 notifyDataSetChanged() 但什么也没发生。 是的,您需要通知适配器该特定更改。 notifyDataSetChanged() 应该可以解决您的问题。如果您想要另一种显示数据的方式,this 是您可以从 Firebase 实时数据库中检索数据并使用 FirebaseRecyclerAdapter 将其显示在 RecyclerView 中的方法。它将自动为您处理所有操作。因此,当您添加/删除/更新项目时,适配器会自动刷新。【参考方案2】:

事件对象应该包含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");
                            
                        
                    );

完整的例子可以看http://www.zoftino.com/firebase-realtime-database-android-example

【讨论】:

我在 Freezer Items 下有另一个孩子,这是使用 push() 的随机密钥,我如何得到它? 它应该是您的商品数据的一部分,当您获取时需要填充它。 for (DataSnapshot adSnapshot: dataSnapshot.getChildren()) 事件 eobj = adSnapshot.getValue(Event.class);字符串键 = dataSnapshot.getKey(); eobj.setItemKey(key); mDataSet.add(eobj); setItemKey 是指 set_id 吗?如果它是 set_id 它也会显示 NullPointerException 警告【参考方案3】:

我认为它仍然没有解释我们如何获得随机生成的 id。 当我说datasnapshot.getKey() 时,我还有更多元素,它将返回顶部节点,但我希望访问该顶部节点下方的节点,这些节点是随机键。每个随机键都有一些其他值。 我相信我们必须在.push() 之前做一些事情才能得到那个钥匙。稍后保存在模型中

user---
     -sSHSsdlkjjfh..
     -sSHSLSHBSB...
     -sSHSLKJSSKJ...

【讨论】:

以上是关于如何让 push() 密钥生成我的 Firebase?的主要内容,如果未能解决你的问题,请参考以下文章

如何从 Firebase 中的第二个生成的密钥获取数据?

使用 Ansible 生成密钥

如何在 git push 之前从 Android 项目中删除 API 密钥

如何将已生成的 SSH 密钥添加到 git bash?

服务如何生成和使用公共和秘密 API 密钥?

如何使用命令行中的密码生成 openSSL 密钥?