簡體   English   中英

如何在 Firebase for Android 中查詢多對多關系?

[英]How to query many to many relationship in Firebase for Android?

我正在嘗試使用 firebase 數據庫構建一個簡單的購物清單 android 應用程序。

快速上下文:用戶使用電子郵件注冊,並且應該能夠創建一個組以共享屬於該組(以及該組的所有成員)的購物清單。 然后稍后將購物清單項目添加到購物清單中。

我有點糾結於如何處理用戶和組之間的多對多關系。 我讀了這篇文章: Firebase 中的多對多關系基於此,我在 Firebase 中創建了這個數據結構:

在此處輸入圖像描述

我真的不明白我將如何准確地查詢這個。 當我們在 Firebase 中使用值事件偵聽器時,我的猜測是我需要將偵聽器附加到數據庫引用並將相關數據本地保存在應用程序中以填充屏幕。 例如,我想要一個包含屬於用戶的所有組的回收器視圖,其中卡片將顯示組的名稱、組的創建日期和組成員。 基於上面的數據結構,就是4個獨立的值事件監聽器相互嵌套,這樣對嗎?

這是我編寫的代碼的一部分,這只是保存每個組的用戶 ID,因此需要另一個嵌套查詢:

//get group ids - there is at least one as own_group is set up with the user details
Utils.userGroupReference.child(Utils.firebaseUserID).addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(@NonNull DataSnapshot snapshot) {
        for (DataSnapshot groupIDSnapshot : snapshot.getChildren()) {
            Utils.myGroupIDs.add(groupIDSnapshot.getKey());
        }

        for (int i = 0; i < Utils.myGroupIDs.size(); i++) {
            //get groups based on group ids
            Utils.groupReference.child(Utils.myGroupIDs.get(i)).addValueEventListener(new ValueEventListener() {
                @Override
                public void onDataChange(@NonNull DataSnapshot snapshot) {
                    Group group = (snapshot.getValue(Group.class));
                    GroupUser groupUser = new GroupUser(group);
                    Utils.myGroups.add(group);
                    Utils.groupUserReference.child(snapshot.getKey()).addValueEventListener(new ValueEventListener() {
                        @Override
                        public void onDataChange(@NonNull DataSnapshot groupUserSnapshot) {
                            ArrayList<String> userIDs = new ArrayList<>();
                            for (DataSnapshot userIDSnapshot: groupUserSnapshot.getChildren()) {
                                userIDs.add(userIDSnapshot.getKey());
                            }
                            Utils.myGroupUsers.add(new GroupUser(group, userIDs));
                        }

                        @Override
                        public void onCancelled(@NonNull DatabaseError error) {

                        }
                    });
                    Utils.myGroupUsers.add(groupUser);
                }

                @Override
                public void onCancelled(@NonNull DatabaseError error) {

                }
            });

如果有人能為我闡明這一點,我將不勝感激。

另一個問題是我們通常在哪里調用 value 事件偵聽器? 此片段來自 MainScreen 中的 onCreate() 方法,該方法最終將包含所有購物清單。 我想把它放在啟動畫面中,但我的經驗是,每當更新節點時,應用程序都會返回到包含值事件偵聽器的屏幕,所以我不確定哪個是更好的選擇

非常感謝!

我通常會使用addListenerForSingleValueEvent偵聽器或getData調用來加載這里的一些內部數據,但您需要為加載的每條數據單獨調用是正確的。

由於Firebase 通過單個連接對所有這些請求進行管道傳輸,因此數據加載速度非常快 - 所以實際上只是代碼有點復雜。

如果這是您想要阻止的事情,您可以考慮將用戶的一些數據復制到該User所在的每個GroupUser和/或UserGroup條目中。 這將使寫入數據的代碼更加復雜,但簡化了數據加載。

在處理 NoSQL 數據庫時,這種權衡很常見,這也是它們可以擴展到如此多用戶的原因之一。 要了解有關此內容的更多信息,我建議查看NoSQL 數據建模面向 SQL 開發人員的 Firebase了解 Cloud Firestore (后者適用於 Cloud Firestore,但許多課程也適用於此處)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM