2016-10-04 2 views
1

Чтобы избавиться от этого пути, да, есть аналогичный вопрос о SO, но он не объясняет, в чем моя ситуация требует, я думаю.Android Firebase: как просто получить все значения под определенным ключом?

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

users{ 
    userid{ 
     templates{ 
      templateName1{ // example name that the user saves their template as. 
          // each template is an ArrayList 
        //templateName1 ArrayList contents 
      } 
      templateName2{ 
        //templateName1 ArrayList contents 
      } 
      templateName2{ 
        //templateName1 ArrayList contents 
      } 
     } 
    } 
} 

Мне нужно, чтобы иметь возможность перечислить каждый шаблон в «шаблоны», а в другое время просто получить ArrayList значение конкретного шаблона. Однако я не могу понять, как это сделать.

Из того, что я гугл/прочитать в документации, мой код должен выглядеть примерно так:

DatabaseReference mTemplateRef = mDatabase.child("users").child(uid).child("templates"); 

    mTemplateRef.addListenerForSingleValueEvent(
      new ValueEventListener() { 
       @Override 
       public void onDataChange(DataSnapshot dataSnapshot) { 
        dataSnapshot.getChildren(); 

        // somehow get the values here 

       } 
    }); 

Когда я отладка, и введите dataSnapshot.getChildren выражения данных() я могу увидеть содержимое как и ожидалось, но я не могу получить эти данные в своем приложении. Есть идеи?

ответ

1

Это то, что я искал:

settingsRef.addListenerForSingleValueEvent(new ValueEventListener() { 
     @Override 
     public void onDataChange(DataSnapshot dataSnapshot) { 
      for(DataSnapshot dataSnapshot1 : dataSnapshot.getChildren()){ 
       // easy 
       String value = dataSnapshot1.getValue(String.class);      
      } 
     } 

     @Override 
     public void onCancelled(DatabaseError databaseError) { 

     } 
    }); 
0

что-то вроде этого кода:

mTemplateRef.addListenerForSingleValueEvent(
      new ValueEventListener() { 
       @Override 
       public void onDataChange(DataSnapshot dataSnapshot) { 
       // dataSnapshot itself a child of "templates" 
     DataSnapshot messageSnapshot= dataSnapshot; 
        DataType author =   (DataType)messageSnapshot.child("array").getValue(); 

        // somehow get the values here 

       } 
    }); 
1

Это предполагается, что вы создаете класс для шаблона с добытчиками, пустой и параметризованных конструкторов, как показано

public class Template { 

    String name; 
    ArrayList<String> list; 

    public Template() { 
    } 

    public Template(String name, ArrayList<String> list) { 
     this.name = name; 
     this.list = list; 
    } 

    public String getName() { 
     return name; 
    } 

    public ArrayList<String> getList() { 
     return list; 
    } 
} 

теперь вы можете легко сделать это

databaseReference.addListenerForSingleValueEvent(new ValueEventListener() { 
     @Override 
     public void onDataChange(DataSnapshot dataSnapshot) { 

      for(DataSnapshot data : dataSnapshot.getChildren()){ 

       Template template = data.getValue(Template.class); 
       // use this object and store it into an ArrayList<Template> to use it further 

      } 

     } 

     @Override 
     public void onCancelled(DatabaseError databaseError) { 

     } 
    }); 
+0

Хм, у меня все еще проблемы. Как это позволит мне перечислить все ArrayLists под ключевыми «шаблонами»? Может быть, есть отдельный ArrayList, к которому добавляется каждая итерация? Как этот параметр ArrayList соответствует вашему шаблону? Я также получаю эту ошибку: com.google.firebase.database.DatabaseException: Невозможно преобразовать объект типа java.util.ArrayList, чтобы напечатать com.app.template_editor.template – theRealOne

+0

Я собираюсь оставить свой предыдущий комментарий вверх в случае, если вы видите что-то очевидное, но я думаю, что знаю, что делать, я просто не смогу проверить его до сегодняшнего дня после школы. Я обновлю, если это сработает – theRealOne

+0

Итак, прямо сейчас я сделал то, что вы сказали, но я получаю сообщение об ошибке «Я не могу преобразовать объект типа ArrayList, чтобы набирать Template», при этом Template является классом, который вы предоставили. – theRealOne

Смежные вопросы