2017-02-18 2 views
1
{message:{ 
    "id1":{ 
    "name":"name1" 
}, 
    "id2":{ 
    "name":"name2" 
}, 
    "id3":{ 
    "name":"name3" 
}... and so on 
}} 

Предположим, что у меня есть структура данных из базы данных, подобная выше, теперь я пытаюсь получить значение первого id (например, его имя), используя child ("id1") ... value(). Могу ли я получить и запросить данные «id2» или остальных узлов на одном уровне?Когда я получаю дочерний узел и получаю доступ к его данным, какие данные я также запрошу?

Исключая затраты на хранение данных в базе данных, будет ли стоить больше запросов к одному узлу (получение всех его внутренних значений), когда число узлов в «сообщении» начинает расти?

+0

Вы можете сохранить структуру данных внутри своего приложения, прочитать ее один раз в конструкторе, а затем получить, обновлять свои данные всякий раз, когда захотите. и в конце обновления приложения firebase. но таким образом вы теряете функцию реального времени –

ответ

0

Вы должны сделать, как это вы хотите, чтобы все ценности ребенка на тот же уровень

firebase.child("message").addListenerForSingleValueEvent(new ValueEventListener() { 
@Override 
public void onDataChange(DataSnapshot dataSnapshot) { 
    for (DataSnapshot innerDataSanpShot : dataSnapshot.getChildren()) { 
     //DataSnapshot of inner Childerns mean id1, id2.... so on 
     String name = innerDataSnapShot.child("name").getValue().toString(); 
    } 
} 

@Override 
public void onCancelled(FirebaseError firebaseError) { 

} 
}); 

Другой способ заключается в том, что вы можете получить всю информацию о сообщении, и после этого вы можете получить каждый ребенок данные по этим

dataSnapshot.child("id1"). getValue(); 
+0

Не совсем мой вопрос, я хочу избежать касания узлов, отличных от «id1» в моем случае. Меня интересует, является ли уместным наличие «сообщения» главного узла, сохраняющего все сообщения, независимо от того, в какой комнате он находится. Если у меня уже есть конкретный чат, который хранит, какой messageid он принадлежит. –

0

Не зная своей целевой платформы, я буду считать ее веб-приложение. Для того, чтобы выполнить запрос для данных на узле вопрос, вы можете сделать что-то вроде следующего:

var data = snapshot.val(); 
var userMessage = data.id1.message; 

Этот простой пример показывает сообщение в конкретном месте, которое вам нужно будет подставить " id1 'в правильном формате. Вы не будете вызывать данные с других уровней, поскольку вы используете значение «id1», чтобы точно определить узел, с которым вы хотите запросить данные.

С точки зрения вашего второго вопроса, я не думаю, что это будет стоить вам больше, запрашивая один узел по мере роста базы данных, предоставляя вам запрос в этом конкретном месте. Конечно, если вы добавите цикл, это изменит ситуацию в зависимости от размера вашей базы данных.

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