Извлечение строк из базы данных реального времени в 2D ArrayList Android

#java #android #firebase #firebase-realtime-database

#java #Android #firebase #firebase-realtime-database

Вопрос:

У меня есть структура базы данных Firebase в реальном времени, подобная этой :

Структура Firebase

Как мне извлечь это в 2D ArrayList, подобный этому, используя Java.

 private String mChoices [][] = {
        {"Mutare", "Harare", "Bulawayo","Mozambique"},
        {"Johhannesburg", "Pretoria", "Duran","Capetown"},
        {"Nairobi", "Lusaka", "Windhoek","Lilongwe"},
        {"Harare", "Lilongwe", "Pretoria","Nairobi"}
};
  

Комментарии:

1. Вы уверены, что они получают данные в алфавитном порядке? Насколько я знаю, firebase по умолчанию отправляет данные в том порядке, в котором они уже существуют в базе данных.

2. Я заметил ошибку, которую я ввел, я изменил вопрос

3. В первом массиве должны быть Mutare, Harare, Bulawayo, Mozambique все дочерние элементы первого узла или Mutare, Johannesburg, Nairobi, Harare каждый элемент с определенным индексом? Пожалуйста, ответьте с помощью @AlexMamo

4. @AlexMamo я отредактировал вопрос для ясности, пожалуйста, проверьте и помогите

5. @TinovimbaMawoyo О, теперь все более понятно. Еще один вопрос. Количество массивов и количество элементов в массивах всегда будет равно 4 и 4?

Ответ №1:

Как упоминал @SardorbekKhujaev в своем ответе, массивы являются фиксированными типами данных. Чтобы решить проблему, нам нужно использовать ArrayList, поскольку размер может быть увеличен динамически. Как только мы заполним ArrayList, мы можем просто преобразовать его в 2D массив, как в следующих строках кода:

 DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference choicesRef = rootRef.child("choices");
ValueEventListener valueEventListener = new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        List<String[]> choices = new ArrayList<>();
        for(DataSnapshot ds : dataSnapshot.getChildren()) {
            int size = (int) ds.getChildrenCount();
            String[] choice = new String[size];
            int count = 0;
            for(DataSnapshot dSnapshot : ds.getChildren()) {
                choice[count  ] = dSnapshot.getValue(String.class);
            }
            choices.add(choice);
        }
        String choicesArray[][] = new String[choices.size()][];
        for (int j = 0; j < choices.size(); j  ) {
            choicesArray[j] = choices.get(j);
        }
        //Test the array
        for(String[] array : choicesArray) {
            Log.d(TAG, Arrays.toString(array));
        }
        //Do what you need to do with your 2D array
    }

    @Override
    public void onCancelled(@NonNull DatabaseError databaseError) {
        Log.d("TAG", databaseError.getMessage()); //Don't ignore potential errors!
    }
};
choicesRef.addListenerForSingleValueEvent(valueEventListener);
  

Результатом этого кода будет точный 2D массив, который вы ищете.

Ответ №2:

Вы просите работать с 2D массивом, что усложняет код, поскольку массивы не являются динамическими. Принимая во внимание, что данные firebase являются динамическими, и общее удобство списков массивов в Java, я рекомендую вам использовать ArrayList. Это решение фокусируется на сути вопроса — 2D массиве

 private String[][] mChoices;
private void initializeMChoices(int i, int j) {
    mChoices = new String[i][j];
}
  

Везде, где вам нужно заполнить массив строковыми значениями, вставьте этот код:

         //Get the reference to the "choices" node:
        DatabaseReference ref = FirebaseDatabase.getInstance().getReference("choices");
        ref.addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot snapshot) {
                // We first go through the whole node to count it's child nodes
                int i = 0, j = 0;
                while(snapshot.child(Integer.toString(i)).exists())
                {
                    j = 0;
                    while(snapshot.child(Integer.toString(i)).child(Integer.toString(i)).exists())
                    {
                        j  ;
                    }
                    i  ;
                }
                // we have the numbers, now we initialize the array
                initializeMChoices(i, j);
            //we go through the whole node to put child-node values in the 2D array
            i = 0;
            j = 0;
            while(snapshot.child(Integer.toString(i)).exists())
            {
                while(snapshot.child(Integer.toString(i)).child(Integer.toString(i)).exists())
                {
                    j  ;
                    mChoices[i][j] = snapshot.child(Integer.toString(i)).child(Integer.toString(i)).toString();
                }
                i  ;
            }
        }

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

        }
    });
  

Комментарии:

1. Как мне использовать ArrayLists, я думаю, что они идеальны

2. @AlexMamo предоставил фрагмент кода, реализующий ArrayLists. Я думаю, что теперь ваша проблема решена, и оба ответа, мой и Алекса, можно считать правильными. Я вижу, что Алекс перефразировал вопрос полчаса назад, чтобы он был в целом полезен.