我在我的项目中使用Firebase,并尝试使用Firebase创建一个唯一的密钥。使用此密钥我想在用户启动活动时发送帖子。像这样:
"Posts"
|
-> "Parent Unique key"
|
-> "child unique key 1"
-> "child unique key 2"
-> "child unique key 3"
...
我想创建Parent Unique key
并使用它我想发帖子。我知道如何使用push()
在firebase中创建唯一键,但问题是当用户重新启动活动时,将生成一个新的唯一键。我不想在创建一次之后再次创建相同的父密钥,因为多个用户具有不同的ID,所以我不能在此处使用user_id。此外,我不想将父密钥存储在某些存储介质中。是否可以在firebase中创建这样的密钥?
答案 0 :(得分:2)
如果你在onCreate()
方法中执行此操作:
DatabaseReference ref=FirebaseDatabase.getInstance().getReference().child("Posts").push();
然后是的,每次进入该活动时,都会创建一个新的推送ID。这是因为push()
会生成随机ID。
为了能够解决此问题,您需要稍后添加push()
或在条件下添加 ref.push().child("name").setValue(name);
。
所以你可以点击按钮添加它:
{{1}}
这样,每次单击按钮时,它都会生成推送ID,而不是在重新启动活动时。
答案 1 :(得分: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();
希望这会帮助您找到解决方案。
答案 2 :(得分:0)
要解决此问题,请使用以下代码:
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 :(得分:0)
使用timestamp作为唯一键,firebase本身创建唯一ID