2017-02-10 3 views
0

Я пытался внедрить Firebase в android, у меня есть несколько запросов в этом, я был бы рад, если бы вы помогли мне в этом. Немного запутался. Вот мой вопрос.Firegase pagination limitToFirst() vs limitToLast()

Я показываю чат Firebase в listview, в котором я хочу загружать только 1-й 100 сообщений из firebase, после этого Пользователь будет делать pull-to-refresh, тогда загрузите 1-й 200 сообщений и так далее.

enter image description here

Для этого я ищу в limitToFirst() и limitToLast() не получают идею, один лучше.

Может ли кто-нибудь помочь.

+0

@Frank van Puffelen Я хотел бы получить ваш ответ на этот вопрос, который был бы действительно драгоценным для меня. – Gattsu

+0

@ Maveň спасибо за щедрость, я получил правильный ответ. – Gattsu

ответ

-3

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

От Firebase reference documentation:

limitToFirst

Создает новый Query ограничивается первым конкретным числом детей.

Метод limitToFirst() используется для установки максимального количества детей для синхронизации для заданного обратного вызова. Если мы установим предел 100, изначально мы получим только до 100 child_added событий. Если в нашей базе данных хранится менее 100 сообщений, для каждого сообщения будет срабатывать событие child_added. Однако, если у нас более 100 сообщений, мы получим событие child_added для первых 100 упорядоченных сообщений. Как изменить элементы, мы получим child_removed события для каждого элемента, который выпадает из активного списка, так что общее количество остается на 100.

limitToLast

Создает новый объект Query ограничивается до последнего определенного числа детей.

Метод limitToLast() используется для установки максимального количества детей для синхронизации для заданного обратного вызова. Если мы установим предел 100, изначально мы получим только до 100 child_added событий. Если в нашей базе данных хранится менее 100 сообщений, для каждого сообщения будет срабатывать событие child_added. Однако, если у нас более 100 сообщений, мы получим событие child_added для последних 100 упорядоченных сообщений. По мере изменения элементов мы получим child_removed событий для каждого элемента, который выпадает из активного списка, чтобы общее число оставалось на уровне 100.

3

я сделал почти то же самое, таким образом:

В своем классе (я предполагаю, что это активность), создать переменную-член Query типа:

private Query queryChat; 

В методе onStart , начать делать запрос:

@Override 
public void onStart() { 
    super.onStart(); 

    // initialize your value event listener 

    queryChat= mFirebaseDatabaseReference. 
      .orderByChild("timestamp") 
      .limitToLast(pageSize); 
    queryChat.addListenerForSingleValueEvent(yourValueEventListener); 

} 

pageSize является int и здесь необходимо установить значение 100.

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

Я предполагаю, что вы уже внедрили здесь ValueEventListener. Кроме того, timestamp - это поле в сообщении firebase, в котором вы сохранили метку времени в миллисекундах вашего сообщения.

Теперь определим метод в классе, как это:

private void loadMoreItems() { 

    queryChat= mFirebaseDatabaseReference. 
      .orderByChild("timestamp") 
      .endAt(messageList.get(messageList.size()-1).getTimestamp()) 
      .limitToLast(pageSize); 
    queryChat.addListenerForSingleValueEvent(yourValueEventListener); 
} 

messageList здесь является ArrayList, который хранит сообщения чата, и заполняется внутри ValueEventListener, когда вы получаете сообщения от firebase.

Вот, я говорю, чтобы firebase сделать заказ по возрастанию (как и раньше), но выбирать только те элементы, с отметкой времени < = последний элемент уже виден пользователю. (.endAt(messageList.get(messageList.size()-1).getTimestamp()) говорит на firebase именно это), и, наконец, limitToLast по-прежнему.

И теперь вы можете вызвать этот метод (loadMoreItems) всякий раз, когда вы захотите (в вашем случае, когда пользователь тянет для обновления).

+0

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

+0

Что вы подразумеваете под «какой будет лучше всего для этого случая»? –

+0

@ Valentino Я хочу завязать, какой из них использовать в моем случае? – Gattsu

1

Вы можете попробовать этот способ:

int mPageEndOffset = 0; 
int mPageLimit = 10; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    getActivity().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE); 
    connectDetector = new ConnectDetector(getActivity()); 
    if(connectDetector.getConnection()) { 

     alanRef = new Firebase(firebaseURL).child(EventChatActivity.SuperCateName + "/ " + eventDetail.getCategory_name() + "/ " + eventDetail.getEvent_title() + "/ " + EventChatActivity.eventID).child("StadiumChat"); 
     alanQuery = alanRef.limitToFirst(mPageLimit); 
     userName = MyApp.preferences.getString(MyApp.USER_NAME, null); 

     EventChatActivity.eventID).child("StadiumChat"); 
    } 
}  

Это будет получать записи последних 10 сообщений от firebase.

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