2016-04-29 5 views
0

У меня есть несколько сообщений, и у каждого сообщения есть свои собственные комментарии. Я хочу запросить все сообщения, упорядоченные по их отметкам времени. Я пробовал:Запрос на заказ Firebase

let query = Firebase(url: path) 
let query.queryOrderedByChild("commentDate").observeEventType(.ChildAdded) 
{ (queryResponse, cancelBlock) { .... 

"commentDate" - целые числа на сервере. В этом запросе я получаю только первый объект

let query = Firebase(url: path) 
query.queryOrderedByChild("commentDate").queryLimitedToFirst(100).observeEventType(.ChildAdded) { (queryResponse, cancelBlock) { ... 

я получаю только первый объект, а также ... Единственное решение, которое я есть в данный момент запросить все:

query.queryOrderedByChild("commentDate").observeEventType(.Value) { (queryResponse, cancelBlock) in ... 

Но используя это я должен отсортировать массив перед показом пользователю.

Любые идеи, как я могу их сделать, чтобы отсортировать их на сервере?

Редактировать Представление firebase данных:

{ 
    "-KGRZmSIDXz5hHkelthQ" : { 
    "something1" : "783151", 
    "something2" : "21", 
    "something3" : "wjeicisje ejej", 
    "comments" : "", 
    }, 
    "-KGRa5skGzA1GAG09Lno" : { 
    "something1" : "783151", 
    "something2" : "21", 
    "something3" : "wjeicisje ejej", 
    "comments" : "", 
    }, 
    "-KGVr-tti1zr1M1QLlHL" : { 
    "something1" : "783151", 
    "something2" : "21", 
    "something3" : "wjeicisje ejej", 
    "comments" : { 
     "-KGX1_rFSBLmQJ7QzCRc" : { 
     "commentBody" : "something", 
     "commentDate" : 1.461933727259896E9, 
     "commentOwnerImageView" : "something", 
     "commentOwnerName" : "something" 
     }, 
     "-KGX1r5Lnhv9YbQre6as" : { 
     "commentBody" : "something", 
     "commentDate" : 1.461933797884702E9, 
     "commentOwnerImageView" : "something", 
     "commentOwnerName" : "something" 
     }, 
     "-KGXVGKA0SYm-vRs6zsv" : { 
      "commentBody" : "something", 
     "commentDate" : 1.461941507496439E9, 
     "commentOwnerImageView" : "something", 
     "commentOwnerName" : "something" 
     }, 
    }, 
    } 
} 
+0

Что происходит, когда вы используете значение типа события вместо добавления ребенка? –

+0

Когда я устанавливаю «Значение», я получаю все объекты. Но когда я устанавливаю «добавленный ребенок», я получаю только один объект. Для запроса на сервере (orderbyChild) я должен установить функцию registerEventType (.ChildAdded). Вот еще информация: https://www.firebase.com/docs/ios/guide/retrieving-data.html#section-queries – Andrew

+0

Насколько я знаю, вы можете делать запрос с каждым типом события, а не только с добавлением ребенка , И как указано в [guide] (https://www.firebase.com/docs/ios/guide/retrieving-data.html#section-event-types), дочерний элемент должен возвращать только 1 объект. Вы еще пробовали другие заказы? [queryOrderedByChild :, queryOrderedByKey :, queryOrderedByValue или queryOrderedByPriority] (https://www.firebase.com/docs/ios/guide/retrieving-data.html#section-queries) –

ответ

1

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

let commentsRef = ref.childByAppendingPath("-KGVr-tti1zr1M1QLlHL/comments") 

commentsRef.queryOrderedByChild("commentDate").observeEventType(.ChildAdded, withBlock: { 
    snapshot in 

    let nodeData = snapshot.value 
    print(nodeData!) 

}) 

выше будет возвращать каждый дочерний узел , по одному в правильном порядке.

Если у вас есть небольшое количество узлов, вы можете просто читать их в одно времени и итерации по snapshot.children как этот

usersRef.queryOrderedByChild("commentDate").observeEventType(.Value, withBlock: { 
    snapshot in 

    for child in snapshot.children { 
    print(child) 
    } 

}) 

Оба выше будет распечатывать каждый узел комментария заказанного commentDate

Вышеупомянутое будет работать только в том случае, если вы заинтересованы в получении комментариев в каждом сообщении. Если нет, то вам необходимо изменить структуру Firebase и перемещать комментарии к отдельному узлу, как этот

posts 
    post_01 
    post_02 
    etc 

и отдельный узел комментариев, что это относится к сообщению комментарий принадлежит. Поскольку вы хотите запросить комментарии для post_02 и хотите, чтобы они были упорядочены с помощью commentDate, объедините почтовый номер и дату в один дочерний элемент.

comments 
    "-KGX1_rFSBLmQJ7QzCRc" : { 
    "for_post_and_commentDate": "post_02_1.461933727259896E9", 
    "commentBody" : "something", 
    "commentOwnerImageView" : "something", 
    "commentOwnerName" : "something" 
    }, 
    "-KGX1r5Lnhv9YbQre6as" : { 
    "for_post_and_commentDate": "post_02_1.461933797884702E9", 
    "commentBody" : "something", 
    "commentOwnerImageView" : "something", 
    "commentOwnerName" : "something" 
    }, 

, а затем изменить запрос

usersRef.queryOrderedByChild("for_post_and_commentDate") 
    queryStartingAtValue("post_02_0").queryEndingAtValue("post_02_xxx").observeEventType(.Value, withBlock: { 

Вы должны выяснить свой формат commentDate, как было бы легче выработать начальные и конечные метки времени, если они были сохранены: 20160430100621 в формате ГГГГММДДччммсс , то ваши метки времени может быть запрошены так:

starting: post_02_0 
ending: post_02_99999999999999 

Это также дает вам возможность запрашивать для комментариев для post_02, что произошло вчера, или на прошлой неделе.

+0

Ваш код покажет комментарии для одной публикации в правильном порядке. Но ОП попросил «Я хочу запросить все сообщения, заказанные их штампами времени». Поскольку сообщение не имеет метки времени, это невозможно. –

+0

@FrankvanPuffelen Я сделал предположение, что, поскольку узел комментариев имеет commentDate, это то, что они хотели получить. Если это не так, мой ответ не будет работать. Я думаю, что требуется разъяснение от ОП. – Jay

1

Firebase может запрашивать вложенные дети, если вы знаете весь путь (так что-то вроде dimensions/length). Он не может обрабатывать динамические элементы в этом пути под каждым дочерним элементом (например, ваш $commentid/commentDate).

Единственный способ получить эту работу - собрать необходимые данные до уровня, на котором вы можете его запросить. Например, если вы следить за lastCommentDate для каждого блоге:

{ 
    "-KGRZmSIDXz5hHkelthQ" : { 
    "something1" : "783151", 
    "something2" : "21", 
    "something3" : "wjeicisje ejej", 
    "comments" : "", 
    }, 
    "-KGRa5skGzA1GAG09Lno" : { 
    "something1" : "783151", 
    "something2" : "21", 
    "something3" : "wjeicisje ejej", 
    "comments" : "", 
    }, 
    "-KGVr-tti1zr1M1QLlHL" : { 
    "something1" : "783151", 
    "something2" : "21", 
    "something3" : "wjeicisje ejej", 
    "firstCommentDate": 1.461933727259896E9, 
    "lastCommentDate": 1.461941507496439E9, 
    "comments" : { 
     "-KGX1_rFSBLmQJ7QzCRc" : { 
     "commentBody" : "something", 
     "commentDate" : 1.461933727259896E9, 
     "commentOwnerImageView" : "something", 
     "commentOwnerName" : "something" 
     }, 
     "-KGX1r5Lnhv9YbQre6as" : { 
     "commentBody" : "something", 
     "commentDate" : 1.461933797884702E9, 
     "commentOwnerImageView" : "something", 
     "commentOwnerName" : "something" 
     }, 
     "-KGXVGKA0SYm-vRs6zsv" : { 
      "commentBody" : "something", 
     "commentDate" : 1.461941507496439E9, 
     "commentOwnerImageView" : "something", 
     "commentOwnerName" : "something" 
     }, 
    }, 
    } 
} 

С помощью этой структуры вы можете запросить сообщения пользователя их дата последнего комментария:

ref.orderByChild('lastCommentDate').limitToLast(10).on(... 
+0

Привет, Франк, чтобы иметь возможность сортировать, как вы сказали выше, Does ** commentDate (timelapse) ** нужно быть уникальным, независимо от часового пояса? Как создать уникальную временную метку? Если я использую пример ** yyyyMMddHHmmss ** format, а затем orderByChild, я думаю, что это может быть сложно, он даст неверный результат с limitToLast (10). – tobeiosdev

+1

Я бы использовал временные метки вместо определенного формата даты. Но независимо от этого: если бы два комментария были отправлены за один и тот же второй/миллисекунды, они оба установили значение 'lastCommentDate' на то же значение. Это приведет к правильному поведению. –

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