如何创建唯一键并在Firebase中使用它发送数据?

4

我在我的项目中使用Firebase,尝试使用Firebase创建一个唯一的密钥。使用这个密钥,当用户开始活动时,我想要发送帖子,就像这样:

 "Posts"
     |
      -> "Parent Unique key"
                 |
                 -> "child unique key 1"
                 -> "child unique key 2"
                 -> "child unique key 3"
                 ...

我想创建一个父唯一键,并使用它发送帖子。我知道如何使用push()在firebase中创建唯一键,但问题是当用户重新启动活动时,将生成新的唯一键。我不想在创建一次之后再次创建相同的父键,而且我不能在这里使用user_id,因为多个用户具有不同的ID。同时,我也不想将父键存储在某个存储介质中。是否可以在firebase中创建这样的键?


你可以尝试使用用户ID,直到用户数据被删除之前,它不应该发生变化。 - rekire
我的情况不同。我不能在这里使用用户ID。 - Mattwalk
@PeterHaddad 每次调用 push() 都会生成一个唯一的键。我必须在之前创建的相同唯一键上发送帖子。 - Mattwalk
3个回答

2
为了解决这个问题,请使用以下代码:
DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
String uniqueKey = rootRef.child("Posts").push().getKey();
DatabaseReference uniqueKeyRef = rootRef.child("Posts").child(uniqueKey);

如果要添加数据,请仅使用uniqueKeyRef引用。因此,使用此代码,您将仅创建唯一标识符一次。您可以在单个ID下添加这些子项。

如果您想要另一个键,请参见UUID,它可以帮助您为Firebase数据库生成唯一键,而无需使用push()方法。


2
如果您在onCreate()方法内执行此操作:
DatabaseReference ref=FirebaseDatabase.getInstance().getReference().child("Posts").push();

是的,每次进入该活动时都会创建一个新的推送ID。这是因为push()生成一个随机的ID。

要解决这个问题,您需要稍后添加push(),或在某个条件下但不是在开始时添加它。

因此,您可以在单击按钮时添加它:

 ref.push().child("name").setValue(name);

每次点击按钮时,它都会生成一个推送ID,而不是在重新启动活动时生成。

如果我重新启动我的活动,它会再次生成相同的密钥吗 :) ? - Mattwalk
正如我在答案中所说,重新启动活动时不会生成任何随机ID。但是,单击按钮将生成一个随机ID(在这种情况下,我将使用随机ID作为新记录)。您可以根据项目的需要自行添加它... - Peter Haddad
我的情况是使用相同的键。但是你的解决方案会在按钮点击时生成一个唯一的键。我认为我应该将父键存储在Firebase数据库的某个节点上,否则我现在应该使用某些存储介质。 - Mattwalk
我认为我应该将父键存储在Firebase数据库中,否则我必须将其存储在我的Sqlite数据库或共享首选项中。 - Mattwalk
如果我将它存储在我的Sqlite数据库或共享首选项中,并且在某个时候,Sqlite或共享首选项被清除,我将遇到一个重大问题。这就是为什么我避免使用它们的原因。 - Mattwalk
显示剩余3条评论

1
你可以使用push()在Firebase数据库中创建唯一的密钥,然后在该密钥下添加子节点。现在,下次进入该活动时,首先检查父节点是否存在。如果节点存在,则保存父节点键并使用它保存新的子节点。
    String strParentKey;
        DatabaseReference mDatabaseReference = FirebaseDatabase.getInstance().getReference("Posts");
                    mDatabaseReference.addListenerForSingleValueEvent(new ValueEventListener() {
                        @Override
                        public void onDataChange(DataSnapshot dataSnapshot) {
                            if (dataSnapshot != null && dataSnapshot.exists()) {
                                // parent node exists, get parent node from datasnapshot
                              strParentKey = dataSnapshot.value().toString();
                            } else {
                               // parent node doesn't exists, generate parent node using push
                               strParentKey = FirebaseDatabase.getInstance().getReference().child("Posts").push().getKey();
                            }
                        }

                        @Override
                        public void onCancelled(final DatabaseError pDatabaseError) {
                            pOnChildCheckListener.onChildDoesntExist();
                        }
                    });

现在使用parentKey,您可以使用该引用添加子节点。
String childKey = FirebaseDatabase.getInstance().getReference("Posts").child(strParentKey).push().getKey();

希望这能帮助您找到解决方案。

谢谢,我认为这是我场景下的正确解决方案。我也在考虑做同样的事情。感谢你的帮助。 - Mattwalk

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接