【问题标题】:How can I create a unique key and use it to send data in Firebase?如何创建唯一密钥并使用它在 Firebase 中发送数据?
【发布时间】:2018-02-09 11:46:36
【问题描述】:

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

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

我想创建Parent Unique key 并通过使用它来发送帖子。我知道如何使用push() 在firebase 中创建唯一密钥,但问题是当用户重新启动活动时,会生成一个新的唯一密钥。我不想在创建一次后再次创建相同的父键,并且我不能在这里使用 user_id,因为多个用户有不同的 id。另外我不想将父密钥存储在某些存储介质中。是否可以在 firebase 中创建这样的密钥?

【问题讨论】:

  • 您可以尝试使用用户 ID,在删除用户数据之前,该 ID 不应更改
  • 我的情况不同。我不能在这里使用用户 ID..
  • @PeterHaddad 每次调用 push() 都会生成一个唯一的密钥。我必须使用之前创建的相同唯一键发送帖子。

标签: java android firebase firebase-realtime-database unique-key


【解决方案1】:

如果你在 onCreate() 方法中这样做:

DatabaseReference ref=FirebaseDatabase.getInstance().getReference().child("Posts").push();

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

为了能够解决这个问题,您需要稍后添加push()..或者在一个条件下但不是在开头。

所以你可以在单击按钮时添加它:

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

这样每次你点击一个按钮时它都会生成一个推送 id,而不是在你重新启动 Activity 时。

【讨论】:

  • 如果我重新启动我的活动,它会再次生成相同的密钥:) 吗?
  • 正如我在答案中所说,重新启动活动时不会生成随机ID。但是单击按钮会生成一个随机 id(在这种情况下,我使用随机 id 作为新记录)。您可以根据自己的项目随意添加...
  • 我的方案是使用相同的密钥。但是,当单击按钮时,您的解决方案将生成一个唯一键。我想我应该将父密钥存储在 Firebase 数据库的某个节点中,否则我现在应该使用一些存储介质..
  • 在 Firebase 中,push() 用于分隔记录,它是故意随机的,因为使用它的全部目的是分隔数据库中的记录。 “存储介质”是什么意思?
  • 我认为我应该将父键存储在 Firebase 数据库中,否则我必须将其存储在我的 Sqlite 数据库或共享首选项中。
【解决方案2】:

要解决这个问题,请使用以下代码:

DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
String uniqueKey = rootRef.child("Posts").push().getKey();
DatabaseReference uniqueKeyRef = rootRef.child("Posts").child(uniqueKey);

因此,要添加数据,请仅使用 uniqueKeyRef 引用。因此,使用此代码,您将只创建一次唯一 ID。您将能够将这些孩子添加到一个 ID 下。

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

【讨论】:

    【解决方案3】:

    您可以使用 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();
    

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

    【讨论】:

    • 谢谢,我认为这是适合我的方案的正确解决方案。我也想这样做。感谢您的帮助。
    【解决方案4】:

    使用时间戳作为唯一键,firebase自己创建唯一id

    【讨论】:

      猜你喜欢
      • 2016-12-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-01
      • 1970-01-01
      • 2014-06-09
      • 1970-01-01
      相关资源
      最近更新 更多