#java #android #firebase #firebase-realtime-database
#java #Android #firebase #firebase-realtime-database
Вопрос:
У меня есть структура базы данных 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
каждый элемент с определенным индексом? Пожалуйста, ответьте с помощью @AlexMamo4. @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. Я думаю, что теперь ваша проблема решена, и оба ответа, мой и Алекса, можно считать правильными. Я вижу, что Алекс перефразировал вопрос полчаса назад, чтобы он был в целом полезен.