有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java在不知道Firebase实时数据库键值的情况下检索子值

我想获取父键值,其中“drinkManufacturerID”等于currentUsers UID。然而,我不知道VenueIDPushID的值(见下文)。在不知道这些值的情况下,如何检查“drinkManufacturerID”的值是否相等。不重组我的数据库有可能吗

相关代码:

public class DealRawDataActivity extends AppCompatActivity {


DatabaseReference databaseDrinks;
DatabaseReference databaseManufacturer;


String keys;

FirebaseUser currentFirebaseUser = FirebaseAuth.getInstance().getCurrentUser();

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_deal_raw_data);


    databaseDrinks = FirebaseDatabase.getInstance().getReference("drinks").child("-LWLuM2nesg0uaP0dLSn"); //However, this string will not be know! How to get this string value?

    //To later be used in listView
    databaseDrinks.orderByChild("drinkManufacturerID").equalTo(currentFirebaseUser.getUid()).addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
            for (DataSnapshot datas : dataSnapshot.getChildren()) {
                keys = datas.getKey();
            }
            Toast.makeText(getApplicationContext(), keys, Toast.LENGTH_LONG).show();
        }
        @Override
        public void onCancelled(@NonNull DatabaseError databaseError) {

        }
    });

   //databaseManufacturer = FirebaseDatabase.getInstance().getReference("drinks").child(keys);

}

}

数据库结构:

enter image description here


共 (2) 个答案

  1. # 1 楼答案

    I will not know the value of the VenueID or the PushID (see below)

    您需要知道VenueID的值,以便至少能够查询数据库中的-LWLuM2nesg0uaP0dLSn节点。下面的问题是:

    .orderByChild("drinkManufacturerID").equalTo(currentFirebaseUser.getUid())
    

    只有能为你提供该特定物体内的所有饮料

    Is it possible without restructuring my database?

    不,不幸的是,在Firebase中无法查询两个或多个Firebase节点,在树的两层深处,正如您所希望的那样。要解决这个问题,你应该复制你的数据。这种做法被称为denormalization,是Firebase的常见做法。如果你是NoQSL数据库的新手,我建议你看这个视频,Denormalization is normal with the Firebase Database以便更好地理解

    此外,在复制数据时,有一件事需要记住。与添加数据的方式相同,您也需要对其进行维护。换句话说,如果你想更新/删除一个项目,你需要在它存在的每个地方都这样做

    这样说,在您的特定情况下,您应该考虑通过创建另一个名为^ {CD4>}的节点来允许您的数据结构进行反向查找,在这里您应该将对象添加为所有对应的^ {< CD5>}对象。因此,您的数据库结构应该类似于:

    Firebase-root
       |
        - vanues
            |
             - -LZB-86uakRrWpI6VYzd (drink object)
                   |
                    - drinkManufacturerID: "D1eY ... wrT5"
                   |
                    - VenueID: "-LWLuM2nesg0uaP0dLSn"
    

    使用此模式,您可以使用以下代码行简单地查询数据库以获取所有饮料,其中drinkManufacturerID等于uid

    String uid = FirebaseAuth.getInstance().getCurrentUser().getUid();
    DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
    DatabaseReference vanuesRef = rootRef.child("vanues");
    Query query = vanuesRef.orderByChild("drinkManufacturerID").equalTo(uid);
    query.addListenerForSingleValueEvent(/* ... */);
    

    如果你想从特定的酒庄获得所有饮料,只需使用:

    String uid = FirebaseAuth.getInstance().getCurrentUser().getUid();
    DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
    DatabaseReference vanuesRef = rootRef.child("vanues");
    Query query = vanuesRef.orderByChild("VenueID").equalTo(VenueID);
    query.addListenerForSingleValueEvent(/* ... */);
    

    其中VenueID可能包含类似-LWLuM2nesg0uaP0dLSn的值

  2. # 2 楼答案

    你的代码还可以,但它适用于uid或其他任何类型的所有孩子。但是当你需要孩子的时候

    我的意思是,如果UID有3个孩子,例如 UID>;(儿童1)、(儿童2)、(儿童3)

    每个孩子都有自己的孩子

    UID>;(儿童1)>;(childA),(childB)

    。。。。。。(儿童2)>;(childC),(childD)

    。。。。。。(儿童3)>;(childD),(childE)

    这些child中的child(childA,childB,childC,childD,childE)保存着数据 你需要在不知道父密钥和子密钥的情况下得到它,这很容易,兄弟。 你只需要这么做

    for (DataSnapshot postSnapshot1 : dataSnapshot.getChildren()){for (DataSnapshot postSnapshot2 : postSnapshot1.getChildren()){//postSnapshot2 is accessed your child of child// using recycler view, adapter class and model class you can display the whole data for all child of child}}
    

    就用你的代码吧

    databaseDrinks.orderByChild("drinkManufacturerID").equalTo(currentFirebaseUser.getUid()).addValueEventListener(new ValueEventListener() {
     @Override 
    public void onDataChange(@NonNull DataSnapshot dataSnapshot) { 
    for (DataSnapshot datas1 : dataSnapshot.getChildren()) { for(DataSnapshot datas2 : datas1.getChildren()) { String keys = datas2.getKey(); 
    }} 
    Toast.makeText(getApplicationContext(), keys, Toast.LENGTH_LONG).show(); 
    } 
    @Override public void onCancelled(@NonNull DatabaseError databaseError) {
    
            }
        });