获取firebase android中特定值的推送ID
Posted
技术标签:
【中文标题】获取firebase android中特定值的推送ID【英文标题】:Get the pushed ID for specific value in firebase android 【发布时间】:2016-09-02 20:10:26 【问题描述】:当我像下一个一样向它推送值时,我想检索由 firebase 生成的 id
我想检索该电子邮件的“-KGdKiPSODz7JXzlgl9J”这个 ID 我试过 getKey() 但它返回“用户” 当用户获得价值时,它会将整个对象从 id 返回到个人资料图片,这不会让我在我的应用程序中将其作为用户对象
如何解决?
Firebase users = myFirebaseRef.child("users");
users.orderByChild("email").equalTo("z@m.com").addListenerForSingleValueEvent(new ValueEventListener()
@Override
public void onDataChange(DataSnapshot dataSnapshot)
dataSnapshot.getKey();
Log.d("User",dataSnapshot.getRef().toString());
Log.d("User",dataSnapshot.getValue().toString());
@Override
public void onCancelled(FirebaseError firebaseError)
Log.d("User",firebaseError.getMessage() );
);
【问题讨论】:
您是否考虑遍历用户数据快照并使用标识符值(例如电子邮件)来查看您是否有匹配项并检索该匹配快照的值? yes 获取匹配这个值的id 下次:您在问题中包含了 JSON 树的图片。请将其替换为作为文本的实际 JSON,您可以通过单击 Firebase 数据库中的“导出”按钮轻松获取该文本。将 JSON 作为文本使其可搜索,让我们可以轻松地使用它来测试您的实际数据并在我们的答案中使用它,一般来说这只是一件好事。 好的,谢谢你的评论,我下次会这样做 【参考方案1】:当您触发 Firebase 查询时,可能会出现多个结果。因此,当您询问查询的值时,Firebase 会返回一个项目列表。即使只有一个匹配的项目,它也会是一个项目的列表。
所以你必须在你的代码中处理这个列表:
users.orderByChild("email").equalTo("z@m.com").addListenerForSingleValueEvent(new ValueEventListener()
@Override
public void onDataChange(DataSnapshot dataSnapshot)
for (DataSnapshot child: dataSnapshot.getChildren())
Log.d("User key", child.getKey());
Log.d("User ref", child.getRef().toString());
Log.d("User val", child.getValue().toString());
【讨论】:
是的,我知道,但这并不能回答我的问题,因为每个孩子都存在一个唯一的密钥,如果我使用 child.getKey(),我想提取这个密钥它返回我“用户” 你能设置一个 jsbin/jsfiddle 来重现这种行为吗? 你这是什么意思? @NandanKaushikDutta 这是我找到解决方法后对问题的回答[链接] (***.com/a/39492322/3553843)【参考方案2】:只需向用户添加新字段,如 userID,当您创建新用户时添加 uid,然后您可以通过阅读查询来接收它
我就是这样做的。
String userID;// in Users
Firebase users = myFirebaseRef.child("users");
users.orderByChild("email").equalTo("z@m.com").addListenerForSingleValueEvent(new ValueEventListener()
@Override
public void onDataChange(DataSnapshot dataSnapshot)
Users user= dataSnapshot.getChildren().iterator().next().getValue(Users.class);
Log.d("User",user.getUserID());
@Override
public void onCancelled(FirebaseError firebaseError)
Log.d("User",firebaseError.getMessage() );
);
【讨论】:
【参考方案3】:在 Java - android Studio 中,您可以在将项目写入数据库时获取唯一的推送 ID...
根据“Firebase 的:在 Android 上保存数据”:您可以使用对 push() 方法返回的新数据的引用来获取孩子的自动生成键的值或为孩子设置数据。在 push() 引用上调用 getKey() 会返回自动生成的键的值。
要在写入时获取引用,而不是使用单个 push() 加载 DATA...
使用push()在数据库中创建一条空白记录,返回值为记录的引用。 使用 .getKey() 获取该记录的密钥。 使用 .setValue(DATA) 填写空白记录这是一个例子:
FirebaseDatabase fb_db_instance = FirebaseDatabase.getInstance();
DatabaseReference db_ref_Main = fb_db_instance.getReference("string_db_Branch_Name");
hashMap_record = new HashMap<String, String>(); //some random data
hashMap_record.put("key_Item1", "string_Item1");
hashMap_record.put("key_Item2", "string_Item2");
DatabaseReference blankRecordReference = db_ref_Main ;
DatabaseReference db_ref = blankRecordReference.push(); //creates blank record in db
String str_NEW_Records_Key = db_ref.getKey(); //the UniqueID/key you seek
db_ref.setValue( hashMap_record); //sets the record
【讨论】:
如果我要保存的对象不是由纯字符串键和/或值组成的会怎样? firebase.google.com/docs/database/android/read-and-write 演示了 firebase 可以处理什么样的数据...都是 JSON,包括 String、Long、Double、Boolean、Map我解决了它以获取您需要使用 firebase url 的 id
String uid = firebaseRef.child("users").push().getKey();
Log.i("uid", uid);
这将为您提供密钥KG.....
【讨论】:
【参考方案5】:更新 1: 也可以一行获取
String key = mDatabase.child("posts").push().getKey();
//*************************************************** *****************//
在搜索并尝试了很多事情之后,我找到了两种方法来做到这一点 . 1. 第一个通过此功能将帖子上传到服务器时获取密钥
public void uploadPostToFirebase(Post post)
DatabaseReference mFirebase = mFirebaseObject
.getReference(Constants.ACTIVE_POSTS_KEY)
.child(post.type);
mFirebase.push().setValue(post);
Log.d("Post Key" , mFirebase.getKey());
在我已经将它推送到我的数据库中的节点之后,我在我的代码中使用它来获取密钥
public void getUserKey(String email)
Query queryRef = databaseRef.child(Constants.USERS_KEY)
.orderByChild(Constants.USERS_EMAIL)
.equalTo(email);
queryRef.addChildEventListener(new ChildEventListener()
@Override
public void onChildAdded(DataSnapshot dataSnapshot, String s)
//TODO auto generated
@Override
public void onChildChanged(DataSnapshot dataSnapshot, String s)
//TODO auto generated;
@Override
public void onChildRemoved(DataSnapshot dataSnapshot)
//TODO auto generated;
@Override
public void onChildMoved(DataSnapshot dataSnapshot, String s)
//TODO auto generated
@Override
public void onCancelled(DatabaseError databaseError)
//TODO auto generated
);
【讨论】:
【参考方案6】:对于那些使用 TVAC 教程的人(https://www.youtube.com/watch?v=cSMMWOHkP68&list=PLGCjwl1RrtcTXrWuRTa59RyRmQ4OedWrt&index=16)
您可以使用 onClick 方法获取 Key,如下所示:
viewHolder.mView.setOnClickListener(new View.OnClickListener()
@Override
public void onClick(View v)
String key = getRef(position).getKey();
);
【讨论】:
为我工作!但前提是您使用 FirebaseUI 库【参考方案7】:您可以从 push() 中读取密钥,而无需推送值。稍后您可以使用该键创建一个子项并推送该键的值。
// read the index key
String mGroupId = mGroupRef.push().getKey();
....
....
// create a child with index value
mGroupRef.child(mGroupId).setValue(new ChatGroup());
mGroupId
包含用于索引您要保存的值的键。
【讨论】:
这很有帮助,即使我使用的是 javascript。 但是如果我已经推了孩子,然后我想稍后拿到钥匙怎么办?有没有办法得到那个钥匙? @ZeeshanAhmadKhalil 取决于,您创建的孩子是否与您需要读取密钥的操作相同?那么你可以使用这个方法,如果它在代码的不同部分或者如果你将来需要,你可以在下面查看 Frank Van 的答案【参考方案8】:另一个从 firebase 获取唯一 Post-id 的选项是通过在 @Override 方法 public void onChildAdded 中获取密钥 (dataSnapshot.getKey()) 并在本地维护它,例如
private void attachDatabaseReadListener()
if (mTaskEventListener == null)
mTaskEventListener = new ChildEventListener()
@Override
public void onChildAdded(DataSnapshot dataSnapshot, String s)
Task friendlyMessage = dataSnapshot.getValue(Task.class);
friendlyMessage.setId(dataSnapshot.getKey());
System.out.println("friendlyMessage = " + friendlyMessage);
DummyContent.ITEMS.add(new DummyContent.DummyItem("" + DummyContent.ITEMS.size()+1,friendlyMessage.getStatus(),friendlyMessage.getSummary()));
public void onChildChanged(DataSnapshot dataSnapshot, String s)
public void onChildRemoved(DataSnapshot dataSnapshot)
public void onChildMoved(DataSnapshot dataSnapshot, String s)
public void onCancelled(DatabaseError databaseError)
;
mUserDatabaseReference.addChildEventListener(mTaskEventListener); // remove it
dataSnapshot.getKey 将在Task Instance中设置唯一的post id,以后可以使用它来执行任何更新操作。
【讨论】:
【参考方案9】:我遇到过这个问题,我找到了解决方案, 您可以使用以下代码获取它:
dataSnapshot.getChildren().iterator().next().getKey()
【讨论】:
谢谢,这是正确答案。【参考方案10】:只需做类似的事情:
HashMap<String, Object> hashLcl = new HashMap<>();
hashLcl.put("admin", firebaseUser.getUid());
hashLcl.put("name", textPrm);
DatabaseReference referenceLcl = FirebaseDatabase.getInstance().getReference();
String keyLcl = referenceLcl.child("GroupChats").push().getKey();
hashLcl.put("key", keyLcl);
Task task = referenceLcl.child("GroupChats").child(keyLcl).setValue(hashLcl);
task.addOnSuccessListener(aVoid ->
//the data is added and now we are sure to do something related
);
结果如下:
【讨论】:
【参考方案11】:FirebaseDatabase firebaseDatabase = FirebaseDatabase.getInstance();
DatabaseReference databaseReference1 = firebaseDatabase.getReference("users");
databaseReference1.addValueEventListener(new ValueEventListener()
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot)
for(DataSnapshot dataSnapshot1 : dataSnapshot.getChildren())
String key = dataSnapshot1.getKey();
Log.d(TAG, "onCreate: key :" + key);
String email = dataSnapshot1.child("email").getValue(String.class);
String roomno =dataSnapshot1.child("address").getValue(String.class);
Log.d(TAG, "onDataChange: email: " + email);
Log.d(TAG, "onDataChange: address: " + address)
@Override
public void onCancelled(@NonNull DatabaseError databaseError)
);
【讨论】:
一点解释性文字会改进这个答案。【参考方案12】:使用这个
mFirebaseDatabase=mFirebaseDatabase.getInstance().getReference("tablename");
Query query = mFirebaseDatabase.orderByChild("tablenme").getRef();
query.orderByChild("Id").addValueEventListener(new ValueEventListener()
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot)
for (DataSnapshot dataSnapshot1 : dataSnapshot.getChildren())
String id =dataSnapshot1.child("Id").getKey();
String Name = dataSnapshot1.child("Name").getValue().toString();
String lastName= dataSnapshot1.child("lastname").getValue().toString();
flatDataGets.add(Name+"-"+lastname);
ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>(RagisterActivity.this, R.layout.support_simple_spinner_dropdown_item, DataGets);
arrayAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
mRegisterSpinner.setAdapter(arrayAdapter);
mRegisterSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener()
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id)
flatName =DataGets.get(position);
@Override
public void onNothingSelected(AdapterView<?> parent)
);
@Override
public void onCancelled(@NonNull DatabaseError databaseError)
);
【讨论】:
【参考方案13】: // Unity, code in C#
reference = FirebaseDatabase.DefaultInstance.RootReference;
string s = reference.Push().Key;
reference.Child(s).Child(Username).SetValueAsync(Username);
Debug.Log(s);
【讨论】:
您好,您需要使用编辑工具对代码进行格式化,并添加其工作原理的说明【参考方案14】:是的,您可以通过将其名称添加到特定子节点中作为键和值 main_child_name
来检索节点或主子节点名称。
【讨论】:
以上是关于获取firebase android中特定值的推送ID的主要内容,如果未能解决你的问题,请参考以下文章
在 iOS 应用中从 Firebase 获取已发送推送通知的历史记录
如何在 Firebase 实时数据库(Android 开发)中获取特定子项的键值?