2017-11-19 1 views
0

타임 스탬프가 위에있는 메시지가 있어도 아무 것도 반환하지 않습니다. 제대로 정렬되지Firebase .queryStarting not working (Swift)

코드 :

let messagesRef = FIRDatabase.database().reference().child("all-messages").child(messageId).queryOrdered(byChild: "timestamp").queryStarting(atValue: 1511130644) 
중포 기지의

전체 코드가 호출

FIRDatabase.database().reference().child("users").child(currentUserUid).child("timestampOfLastVisit").observeSingleEvent(of: .value, with: { (snapshot) in 

     timestamp = snapshot.value as! NSNumber 

     groupMessagesRef = FIRDatabase.database().reference().child("groups").child(groupId).child("messages") 
     groupMessagesRef.observe(.childAdded, with: { (snapshot) in 

      if self.sentMessage { 
       let messageId = snapshot.key 

       let messagesRef = FIRDatabase.database().reference().child("all-messages").child(messageId).queryOrdered(byChild: "timestamp").queryStarting(atValue: 1511130644) 
       messagesRef.observeSingleEvent(of: .value, with: { (snapshot) in ... 

관련 중포 기지 JSON (가짜 데이터를 명백하게) :

{ 
    "all-messages" : { 
    "-KzLOuvEdLWy7vfc2XsT" : { 
     "fromId" : "zhBZyAVGvAMZWi4QhvKDu7qb3Qr1", 
     "groupId" : "-Kxk3kA9I8OEvNmFcavL", 
     "isStarred" : true, 
     "text" : "This should show", 
     "timestamp" : 1511130640 
    }, 
    "-KzLOw5OxZ4P_I0d70gZ" : { 
     "fromId" : "zhBZyAVGvAMZWi4QhvKDu7qb3Qr1", 
     "groupId" : "-Kxk3kA9I8OEvNmFcavL", 
     "isStarred" : false, 
     "text" : "And so should this", 
     "timestamp" : 1511130644 
    }, 
    "-KzLS4uwDtpW6wHNxrmc" : { 
     "fromId" : "zhBZyAVGvAMZWi4QhvKDu7qb3Qr1", 
     "groupId" : "-Kxk3kA9I8OEvNmFcavL", 
     "isStarred" : false, 
     "text" : "1", 
     "timestamp" : 1511131471 
    }, 
    "-KzLS5FvASnj_ky4WQkd" : { 
     "fromId" : "zhBZyAVGvAMZWi4QhvKDu7qb3Qr1", 
     "groupId" : "-Kxk3kA9I8OEvNmFcavL", 
     "isStarred" : false, 
     "text" : "2", 
     "timestamp" : 1511131472 
    } 
    }, 
    "groups" : { 
    "-Kxk3kA9I8OEvNmFcavL" : { 
     "groupCreator" : "zhBZyAVGvAMZWi4QhvKDu7qb3Qr1", 
     "groupDescription" : "Group", 
     "groupImageUrl" : "https://firebasestorage.googleapis.com/v0/b/groupchat1-a1da3.appspot.com/o/group_profile_images%2FA4DDA286-E7A3-4F96-ABF0-5717F4029C33.png?alt=media&token=6ad79728-74fd-405f-abbf-247dae4684b5", 
     "groupMemberOneSignalIds" : { 
     "5905a2f5-dfa3-46d7-964f-596bd2f2004a" : true, 
     "67b9cb2a-6583-45b4-9fed-93cf333e9ca4" : true, 
     "a1bf9ed9-0959-4c88-974b-5a829c1cdcc9" : true, 
     "f2fb84b9-86af-40e7-8667-989a95b2e282" : true 
     }, 
     "groupMembers" : { 
     "3lQiuzudFGW51UwQ4Mseu8aOxyu2" : true, 
     "JF7SCe3VUcWJi1ujumx0VpyaG5s1" : true, 
     "YEbVehx0cqTvNaKrJTcs5GnRLGM2" : true, 
     "zhBZyAVGvAMZWi4QhvKDu7qb3Qr1" : true 
     }, 
     "groupName" : "1", 
     "groupTags" : { 
     "-Kxk3kHxMuWQHEsaWN5k" : "1", 
     "-Kxk3kHyMB2OL5pNAfW1" : "1", 
     "-Kxk3kHyMB2OL5pNAfW2" : "1" 
     }, 
     "messages" : { 
     "-KzLOuvEdLWy7vfc2XsT" : 1, 
     "-KzLOw5OxZ4P_I0d70gZ" : 1, 
     "-KzLS4uwDtpW6wHNxrmc" : 1, 
     "-KzLS5FvASnj_ky4WQkd" : 1 
     }, 
     "starredMessages" : { 
     "-KzLOuvEdLWy7vfc2XsT" : 1511204335 
     } 
    }, 
    "-Kxn_yTAZvkPls-_s8He" : { 
     "groupCreator" : "JF7SCe3VUcWJi1ujumx0VpyaG5s1", 
     "groupDescription" : "Group 3", 
     "groupImageUrl" : "https://firebasestorage.googleapis.com/v0/b/groupchat1-a1da3.appspot.com/o/group_profile_images%2FD2C68A8F-33DC-43C6-8C99-762315760208.png?alt=media&token=aae87339-877e-484e-a0e1-a2e13455176c", 
     "groupName" : "Group 3", 
     "groupTags" : { 
     "-Kxn_ygovR7mQIph3WiC" : "1", 
     "-Kxn_ygovR7mQIph3WiD" : "1" 
     } 
    } 
    }, 
    "users" : { 
    "JF7SCe3VUcWJi1ujumx0VpyaG5s1" : { 
     "email" : "[email protected]", 
     "groups" : { 
     "-Kxk3kA9I8OEvNmFcavL" : true, 
     "-Kxk3n99i43MYECm1Ix8" : true, 
     "-KxuBPAPBIcROMEtNujW" : true, 
     "-KxuET1pZGg2x_aJvRkU" : true 
     }, 
     "profileImageURL" : "https://firebasestorage.googleapis.com/v0/b/groupchat1-a1da3.appspot.com/o/profile_images%2F246CA55C-446D-4A24-8BE6-8B5B9C0F27AF.png?alt=media&token=47022ccd-1c92-460a-8630-e74a0d68bc4a", 
     "searchUsername" : "madi", 
     "timestampOfLastVisit" : 1511241228, 
     "username" : "Madi" 
    }, 
    "zhBZyAVGvAMZWi4QhvKDu7qb3Qr1" : { 
     "email" : "[email protected]", 
     "groups" : { 
     "-Kxk3kA9I8OEvNmFcavL" : true, 
     "-Kxk3n99i43MYECm1Ix8" : true 
     }, 
     "profileImageURL" : "https://firebasestorage.googleapis.com/v0/b/groupchat1-a1da3.appspot.com/o/profile_images%2FBDC4020E-9F54-4F80-A4DC-668804215DE3.png?alt=media&token=ec2c8875-e6e4-40d5-8c07-3d743bf4ea16", 
     "searchUsername" : "connor", 
     "timestampOfLastVisit" : 1511205356, 
     "username" : "Connor" 
    } 
    } 
} 

무엇 인쇄 (스냅 샷) 인쇄물 :

,288,

인쇄 (messageRef는)

(/all-messages/-KzLOw5OxZ4P_I0d70gZ { 
    i = timestamp; 
    sp = 1511130644; 
}) 
+0

이 질문은 모든 곳에서 가능합니다. 코드에서 참조 된 노드는 * all-messages *, * timestampOfLastVisit *, * group * 링크에 표시되지 않습니다. 일반적으로 Firebase 구조의 스 니펫을 TEXT (Firebase 콘솔 -> JSON 내보내기)로 포함시키는 것이 가장 좋습니다. 존재하지 않는 노드가 참조되고있는 것처럼 해당 특정 노드를 처리하는 코드 단편을 포함 시키면 결과에 노드가 발견되지 않습니다. 어쩌면 messagesRef가 실제로 참조하는 메시지 즉, print (messagesRef)가 도움이 될 것입니다. 질문을 업데이트 할 수 있다면 문제를 찾을 수 있습니다. – Jay

+0

오. 마지막 쿼리에서 .queryOrdered (byChild : "timestamp")가 누락되어 Firebase가 쿼리중인 노드를 인식합니다. – Jay

+0

@Jay 업데이트 된 게시물.그것은 .queryStarting (atValue :) 제거하면 완벽하게 작동하지만 모든 메시지를로드합니다. 그러나, 사용자가 마지막으로 방문한 이후로 보낸 메시지 만로드하므로 .queryStarting (atValue :)을 포함하고 싶습니다. 그러나 이로 인해 스 냄샷 값이 널 (NULL)이되며 해당 시간 소인 이후의 메시지뿐만 아니라 모든 메시지를 계속 조회합니다. 고마워요. – connorvo

답변

0

목표는 특정 시간 스탬프가 노드를 반환하는 쿼리를 작성하는 것입니다.

문제는 코드가 한 수준을 너무 깊게 쿼리하고 있다는 것입니다. 이 1511130644.의 자식 타임 스탬프 그래서 반복 할 필요가있다 하나를 찾을 때까지 즉, 모든 메시지의 자식 노드를 통해 중포 기지 반복 처리를 할 필요가

msg_0 
msg_1 
msg_2 

이상 코드가 너무 구체적이고 쿼리의 데이터에 대한 특정 메시지 ID를 보도록 지시하고 있습니다. 정확하게 경로를 알고있는 것처럼 이해할 수 없으며 쿼리 할 필요가 없습니다.

이것은 일반적인 오해입니다. 쿼리는 부모 노드와 부모 노드 바로 아래 child_nodes를 반복 할 때 쿼리 할 대상의 자식 노드에서 제공해야합니다. 여기

parent_node 
    child_node 
    child_node_of_what_you_are_querying 
    child_node 
    child_node_of_what_you_are_querying 

특정 타임 스탬프를 쿼리하는 코드 - 당신은 이미 특정 경로는 직접 관찰 할 수있는 알고있는 경우 messageId가이

//self.ref is the firebase ref 
let messagesRef = self.ref.child("all-messages").queryOrdered(byChild: "timestamp") 
               .queryStarting(atValue: 1511130644) 
messagesRef.observeSingleEvent(of: .value, with: { (snapshot) in 
    if snapshot.hasChildren() { 
     print("got snap with children") 
    } else { 
     print("no snap found") 
    } 
}) 

필요되지 않습니다. 따라서 특정 메시지에 대한 타임 스탬프를 인쇄하려는 경우

let thisMsgRef = self.ref.child("all-messages").child(messageId) 
let thisTimestampRef = thisMsgRef.child("timestamp") 
thisTimestampRef.observeSingleEvent(of: .value) { snapshot in 
    print(snap.value) //prints the timestamp 
} 
+0

굉장한 Jay! 고맙습니다 – connorvo

0

queryStartingAtValue()의 두 번째 인수는 첫번째 인수 일치하는 항목 사이에서 명확하게하기 위해 사용된다. timestamp으로 필터링하려면 queryOrderedByChild("timestamp")를 호출해야합니다 :

let messagesRef = 
    FIRDatabase.database().reference().child("all-messages").child(messageId) 
      .queryOrdered(byChild: "timestamp") 
      .queryStarting(atValue: 1511130644) 
+0

그래, 나도 그걸 시도해 봤어. 내가 붙여 넣을 때 두 번째 주장을 포함 시키려고 했어. 그래도 작동이 안되는. 사실, .queryEqual (toValue :)를 사용하고 하드 코딩 된 값을 전달하면 작동하지도 않습니다. 하나의 자식 노드 만 정렬하면 작동 할 수 있습니다. 관찰 .child. 대신 .valueAdAdded – connorvo

+0

내가 사용하려고하는 전체 Firebase 코드를 추가했습니다. 문제를 일으키는 것입니다. – connorvo