次のように値をプッシュしたときにfirebaseによって生成されたIDを取得したい
「-KGdKiPSODz7JXzlgl9J」を取得したい私のアプリのユーザーオブジェクトとして
これをどのように解決しますか?
Firebase users = myFirebaseRef.child("users");
users.orderByChild("email").equalTo("[email protected]").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() );
}
});
更新1:1行でも取得できます
String key = mDatabase.child("posts").Push().getKey();
// *************************************************** ************** //
多くのことを探して試した後、私はそれをする2つの方法に来ました。 1.この関数を介してサーバーに投稿をアップロードするときにキーを取得する最初の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
}
});
}
値をプッシュせずに、Push()からキーを読み取ることができます。後で、そのキーを持つ子を作成し、そのキーの値をプッシュできます。
// read the index key
String mGroupId = mGroupRef.Push().getKey();
....
....
// create a child with index value
mGroupRef.child(mGroupId).setValue(new ChatGroup());
mGroupId
には、保存しようとしている値にインデックスを付けるために使用されるキーが含まれています。
Firebaseクエリを実行すると、複数の結果が生じる可能性があります。そのため、クエリの値を要求すると、Firebaseはアイテムのリストを返します。一致するアイテムが1つしかない場合でも、1つのアイテムのリストになります。
したがって、コード内でこのリストを処理する必要があります。
users.orderByChild("email").equalTo("[email protected]").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());
}
}
Java-Android Studioでは、アイテムがデータベースに書き込まれるときに一意のプッシュIDを取得できます。
「Firebase's:Save Data on Android」:Push()メソッドによって返された新しいデータへの参照を使用して、子の自動生成キーの値を取得したり、子のデータを設定したりできます。 Push()参照でgetKey()を呼び出すと、自動生成されたキーの値が返されます。
単一のPush()で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 urlを使用するために必要なIDを取得するために解決しました
String uid = firebaseRef.child("users").Push().getKey();
Log.i("uid", uid);
これはあなたにキーKG.....
を与えます
TVACチュートリアルを使用している場合( https://www.youtube.com/watch?v=cSMMWOHkP68&list=PLGCjwl1RrtcTXrWuRTa59RyRmQ4OedWrt&index=16 )
次のようにonClickメソッドを使用してキーを取得できます。
viewHolder.mView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String key = getRef(position).getKey();
}
});
新しいユーザーを作成すると、userIDなどのユーザーに新しいフィールドを追加するだけで、クエリを読み取って受け取ることができます
私はこのようにやっています。
String userID;// in Users
Firebase users = myFirebaseRef.child("users");
users.orderByChild("email").equalTo("[email protected]").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() );
}
});
私はこの問題に直面していましたが、解決策を見つけました。次のコードを使用して解決できます。
dataSnapshot.getChildren().iterator().next().getKey()
Firebaseから一意のPost-idを取得する別のオプションは、@ Overrideメソッドでキー(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は、タスクインスタンスに一意の投稿IDを設定し、後で更新操作を実行するために使用できます。
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) {
}
});
FirebaseDatabase.getInstance().getReference(FConst.PATIENTS).Push().setValue(patient);