代码之家  ›  专栏  ›  技术社区  ›  Sharon

我能同时用两个不同的函数从数据库中检索两个文档吗?

  •  0
  • Sharon  · 技术社区  · 6 年前

    我正在Android工作室写一个应用程序。它连接到Firebase Firestore。

    数据的结构如下(为了清晰起见,我去掉了不相关的部分):

    Boxes
       - box1
          - grid_id
          - table_id
       -box2
          - grid_id
          - table_id
    Grids
        - grid1
        - grid2
    Tables
       - table1
       - table2
    

    因此,每次检索一个框时,我还需要检索相应的网格和表。

    在我的活动中,我有以下几点:

    public class BoxViewActivity {
    
       String box_id;
       Box box;
       FirebaseFirestore databaseRef;
       BoxFragment boxFragment;
       GridFragment gridFragment;
       TableFragment tableFragment;
       FragmentManager fragmentManager;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
    
            setContentView(R.layout.activity_edit_box);
            fragmentManager = getSupportFragmentManager();
            boxFragment = fragmentManager.findFragmentById(R.id.fragment_box);
    
            // Retrieve Box from database and set it up
            Intent intent = getIntent();
            box_id = intent.getStringExtra("BoxId");
            box = new Box();
    
            databaseRef = FirebaseFirestore.getInstance();
    
            boxDocRef = databaseRef.collection("boxes").document(box_id);
            boxDocRef.get().addOnCompleteListener(new OnCompleteListener<DocumentSnapshot>() {
                @Override
                public void onComplete(@NonNull Task<DocumentSnapshot> task) {
                    if (task.isSuccessful()) {
                        DocumentSnapshot document = task.getResult();
                        if (document.exists()) {
                            // Set up Box
                            box = document.toObject(Box.Class);
                            if (box != null) {
                                // Set up some box views
                            }
                            // Get grid/table key
                            setUpGrid(box.getGridId());
                            setUpTable(box.getTableId());
                        }
                    }
                }
            });
        }
    
        private void setUpGrid(String gridId) {
    
            DocumentReference gridRef = databaseRef.collection("grids").document(gridId);
    
            gridRef.addOnCompleteListener(new OnCompleteListener<DocumentSnapshot>() {
    
                @Override
                public void onComplete(@NonNull Task<DocumentSnapshot> task) {
                    if (task.isSuccessful()) {
                        DocumentSnapshot document = task.getResult();
                        if (document.exists()) {
                            // Retrieve Grid
                            Grid grid= document.toObject(Grid);
                            if (grid != null) {
                                boxFragment.setGrid(grid);
                            }
                        }
                    }
                }
            });
        }
    
        private void setUpTable(String tableId) {
            if(tableId == null) return;
    
            DocumentReference tableRef = databaseRef.collection("tables").document(tableId);
    
            tableRef.get().addOnCompleteListener(new OnCompleteListener<DocumentSnapshot>() {
    
                @Override
                public void onComplete(@NonNull Task<DocumentSnapshot> task) {
                    if (task.isSuccessful()) {
                        DocumentSnapshot document = task.getResult();
                        if (document.exists()) {
                            Table table = document.toObject(Table.Class);
                            if (table != null) {
                                boxFragment.setTable(table);
                            }
                        }
                }
            });
        }
    
    }
    

    我遇到的问题是,应用程序似乎“冻结”,然后重新启动时,我点击这个活动。屏幕变为空白且无响应,然后应用程序重新启动。androidstudio没有抛出任何错误,调试控制台也没有任何错误。我怀疑这是因为我同时检索网格和表-这会减慢速度吗?如果是这样,有什么更好的方法?还是我错过了什么?

    1 回复  |  直到 6 年前
        1
  •  1
  •   Alex Mamo    6 年前

    为了解决这个问题,我建议你加一个 Grid 和一个 Table 中的对象 Box 对象。这样你就可以使用一个监听器而不是三个。所以你的代码应该是这样的:

    boxDocRef = databaseRef.collection("boxes").document(box_id);
    boxDocRef.get().addOnCompleteListener(new OnCompleteListener<DocumentSnapshot>() {
        @Override
        public void onComplete(@NonNull Task<DocumentSnapshot> task) {
            if (task.isSuccessful()) {
                DocumentSnapshot document = task.getResult();
                FragmentManager fragmentManager = getSupportFragmentManager();
                BoxFragment boxFragment = fragmentManager.findFragmentById(R.id.fragment_box);
                if (document.exists()) {
                    // Set up Box
                    box = document.toObject(Box.Class);
                    if (box != null) {
                        // Set up some box views
                        // Get grid/table key
                        Grid grid = box.getGrid();
                        boxFragment.setGrid(grid);
                        Table table = box.getTable();
                        boxFragment.setTable(table);
                    }
                }
            }
        }
    });
    

    删除你的声明 FragmentManager BoxFragment . 两者都应该只出现在 onComplete() 方法。