Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/94.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios Firebase.QueryStart不工作(Swift)_Ios_Swift_Firebase_Firebase Realtime Database - Fatal编程技术网

Ios Firebase.QueryStart不工作(Swift)

Ios Firebase.QueryStart不工作(Swift),ios,swift,firebase,firebase-realtime-database,Ios,Swift,Firebase,Firebase Realtime Database,这只是没有返回任何内容,即使有时间戳在这条消息之上的消息 代码排序不正确: let messagesRef = FIRDatabase.database().reference().child("all-messages").child(messageId).queryOrdered(byChild: "timestamp").queryStarting(atValue: 1511130644) Firebase调用的完整代码: FIRDatabase.database().reference

这只是没有返回任何内容,即使有时间戳在这条消息之上的消息

代码排序不正确:

let messagesRef = FIRDatabase.database().reference().child("all-messages").child(messageId).queryOrdered(byChild: "timestamp").queryStarting(atValue: 1511130644)
Firebase调用的完整代码:

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 ...
相关Firebase 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" : "Madi@gmail.com",
      "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" : "Connor@gmail.com",
      "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"
    }
  }
}
printsnapshot打印的内容:

Snap (-KzLOw5OxZ4P_I0d70gZ) <null>
queryStartingAtValue的第二个参数仅用于消除与第一个参数匹配的项之间的歧义。要按时间戳筛选,应调用queryOrderedByChildtimestamp:


目标是创建一个查询,该查询将返回具有特定时间戳的节点

问题是您的代码查询的级别太深。换句话说,您需要让Firebase在所有消息的子节点上迭代,直到它找到一个具有1511130644子时间戳的节点。所以它需要迭代

msg_0
msg_1
msg_2
等等

您的代码试图过于具体,您告诉它查看查询中数据的特定消息Id-这没有意义,因为如果您知道确切的路径,就不需要查询

这是一个常见的误解-请记住,查询需要先提供给父节点,然后提供给您所查询内容的子节点,因为它将在父节点下方的子节点上迭代

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
}

是的,我也试过了,只是碰巧我在粘贴第二个参数的时候尝试了。仍然不起作用。事实上,如果我使用.queryEqualtoValue:并只传入一个硬编码的值,我甚至无法让它工作。如果我在只有一个子节点的节点上进行排序,并观察到.childAdded而不是.value,我就可以让它工作。我添加了我正试图使用的完整Firebase代码,这导致了问题。这个问题有点到处都是;代码中引用的节点未显示在链接、所有消息、TimestampOfLastVisite、组等中。一般来说,最好包含Firebase结构的一个片段,如文本Firebase console->Export JSON,还包括处理这些特定节点的代码片段,就像引用的节点不存在一样,您的结果将是找不到节点。也许指出messagesRef实际引用的内容(例如printmessagesRef)会有所帮助。如果你能更新你的问题,我们可以看一看,也许能找到问题所在。您在上次查询中缺少.queryOrderedbyChild:timestamp,因此Firebase知道您在哪个节点上查询。@Jay更新了帖子。如果我删除.queryStartingatValue:,它会很好地工作,但它会加载所有消息。但是,我想包括.queryStartingatValue:因此我只加载自用户上次访问以来发送的消息。但是,这会导致快照值为null,并且它仍然查询所有消息,而不仅仅是时间戳之后的消息。谢谢你,杰伊!非常感谢。
//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
}