你的數據庫結構是好的,但不幸的是,火力地堡查詢只能order/filter by a single property
。因此,Firebase中沒有WHERE
子句。你應該怎麼做,是將一個名爲name_username
的複合值耦合起來。你的數據庫結構應該是這樣的:
{
users: {
user_id_of_who_this_username_belongs_to: {
name: "name1",
username: "test1",
name_username: "name1_test1"
},
user_id_of_who_this_username_belongs_to: {
name: "name2",
username: "test2",
name_username: "name2_test2"
},
}
}
正如你可能會看到,我已增加了對每個用戶的新複合值name_username
。這意味着您可以根據此新的name_username
字段查詢您的Firebase數據庫。請注意,我刪除了bio
節點,因爲您的結構中不需要額外的孩子。假設users
節點是你的火力地堡根的直接子,請使用如下代碼:
DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference usersRef = rootRef.child("users");
ValueEventListener eventListener = new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
String searchedNameOrUserName = "test2";
for(DataSnapshot ds : dataSnapshot.getChildren()) {
String name_username = ds.child("name_username").getValue(String.class);
if(name_username.contains(searchedNameOrUserName)) {
Log.d("TAG", name_username);
}
}
}
@Override
public void onCancelled(DatabaseError databaseError) {}
};
usersRef.addListenerForSingleValueEvent(eventListener);
我給你舉個例子搜索test2
關鍵字。 searchNameOfUserName
文本將是用戶輸入的確切搜索名稱或用戶名。
爲了更好地理解,我建議你看到這個tutorial。
您也可以使用Denormalization,這是Firebase數據庫的正常使用方式。因此,您可以創建另一個名爲namesUserNames
的節點,您可以在搜索後僅添加所需的信息。你的新的節點應該是這樣的:
{
namesUserNames: {
user_id_of_who_this_username_belongs_to: {
name_username: "name1_test1"
},
user_id_of_who_this_username_belongs_to: {
name_username: "name2_test2"
},
}
}
使用這個例子中,你不需要下載整個users
節點,你就可以只下載這個特殊的一個。這節省了帶寬。
謝謝,我會在今天晚些時候嘗試一下,當我有時間回到你身邊時,就我的生物財產而言,因爲我有另一個屬性,我忽略了作爲用戶的子女,即: {user_id:{bio:{...},otherProperty:{...}}。順便說一下,您可以使用JavaScript SDK編寫這些代碼?謝謝 – linasmnew
對不起,但我不熟悉JS :( –