Можно ли одновременно получить два документа из базы данных в двух разных функциях? - PullRequest
0 голосов
/ 04 июня 2018

Я пишу приложение в Android Studio.Он подключается к 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);
                        }
                    }
            }
        });
    }

}

Проблема, с которой я столкнулся, заключается в том, что приложение «зависает» изатем перезапустите, когда я нажму на это действие.Экран становится пустым и не отвечает, а затем приложение перезагружается.Android Studio не выдает никаких ошибок, а в консоли отладки ничего нет.Я подозреваю, что это потому, что я получаю таблицу и таблицу одновременно - это замедлит это?Если это так, что может быть лучше?Или я что-то пропустил?

1 Ответ

0 голосов
/ 04 июня 2018

Чтобы решить эту проблему, я предлагаю вам добавить объект 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().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...