我现在正在与Firestore合作,但分页有一些问题。
基本上,我有一个集合(假设有10个项目),其中每个项目都有一些数据和时间戳。
现在,我正在获取前3个项目,如下所示:
Firestore.firestore()
.collection("collectionPath")
.order(by: "timestamp", descending: true)
.limit(to: 3)
.addSnapshotListener(snapshotListener())
在快照侦听器中,我保存了快照中的最后一个文档,以便将其用作下一页的起点。
因此,有时我会要求下一页类似的项目:
Firestore.firestore()
.collection("collectionPath")
.order(by: "timestamp", descending: true)
.start(afterDocument: lastDocument)
.limit(to: 3)
.addSnapshotListener(snapshotListener2()) // Note that this is a new snapshot listener, I don't know how I could reuse the first one
现在我的前端中有从索引0到索引5(共6个)的项目。整齐!
如果索引4处的文档现在将其时间戳更新为整个集合的最新时间戳,则情况将开始恶化。
请记住,时间戳是根据order子句确定其位置的!
我期望发生的是,在应用更改后,我仍然显示6个项目(并且仍按其时间戳排序)
发生的事情是,应用更改后,我只剩下5个项目,因为从第一个快照中推出的项目不会自动添加到第二个快照中。
我是否缺少有关Firestore分页的信息?
编辑:根据要求,我在这里发布更多代码:
这是我的函数以返回快照侦听器。好了,上面我已经发布过的用于请求第一页和第二页的两种方法
private func snapshotListener() -> FIRQuerySnapshotBlock {
let index = self.index
return { querySnapshot, error in
guard let snap = querySnapshot, error == nil else {
log.error(error)
return
}
// Save the last doc, so we can later use pagination to retrieve further chats
if snap.count == self.limit {
self.lastDoc = snap.documents.last
} else {
self.lastDoc = nil
}
let offset = index * self.limit
snap.documentChanges.forEach() { diff in
switch diff.type {
case .added:
log.debug("added chat at index: \(diff.newIndex), offset: \(offset)")
self.tVHandler.dataManager.insert(item: Chat(dictionary: diff.document.data() as NSDictionary), at: IndexPath(row: Int(diff.newIndex) + offset, section: 0), in: nil)
case .removed:
log.debug("deleted chat at index: \(diff.oldIndex), offset: \(offset)")
self.tVHandler.dataManager.remove(itemAt: IndexPath(row: Int(diff.oldIndex) + offset, section: 0), in: nil)
case .modified:
if diff.oldIndex == diff.newIndex {
log.debug("updated chat at index: \(diff.oldIndex), offset: \(offset)")
self.tVHandler.dataManager.update(item: Chat(dictionary: diff.document.data() as NSDictionary), at: IndexPath(row: Int(diff.oldIndex) + offset, section: 0), in: nil)
} else {
log.debug("moved chat at index: \(diff.oldIndex), offset: \(offset) to index: \(diff.newIndex), offset: \(offset)")
self.tVHandler.dataManager.move(item: Chat(dictionary: diff.document.data() as NSDictionary), from: IndexPath(row: Int(diff.oldIndex) + offset, section: 0), to: IndexPath(row: Int(diff.newIndex) + offset, section: 0), in: nil)
}
}
}
self.tableView?.reloadData()
}
}
再一次,我问我是否可以有一个快照侦听器来侦听我从Firestore请求的多个页面中的更改
好吧,我联系了Firebase Google Group的人员寻求帮助,他们告诉我我的用例尚不受支持。
感谢加藤理查森(Kato Richardson)解决我的问题!
对于对细节感兴趣的任何人,请参见此主题
但我需要在通过快照获取所有数据后调用一个方法。如何实现?我应该测试什么?
我正在使用Firestore for Android。我知道它默认启用了持久性。 以下是一些背景: 我的应用程序显示了一个笔记列表,每一个笔记都绑在一个标签上。因此,在创建便笺时,我必须提供标签列表(在中,响应“选择标签”按钮),该列表将由上的快照侦听器提供。由于创建便笺是一个单独的,所以每次用户创建便笺时,都必须提供完整的标签列表。 null
在我的导航抽屉布局中,我以文本视图显示用户的登录。如果他点击一个标题为“编辑配置文件”的按钮,然后提交相应的表单,则可以更改后者。这就是为什么我使用快照侦听器,它更新文本视图。 由于导航抽屉布局在任何执行时间都存在,我应该何时分离侦听器? 如果用户点击了“log out”按钮,我可以将其分离,但如果他从来没有点击它呢?
问题内容: 在我的活动中,我有一个字符串列表,这些字符串代表要将快照侦听器附加到的Firestore文档。我使用Acivity-ModelView- 存储库结构。在活动的onCreate中,我向ViewModelProvider请求适当的ViewModel。在ViewModel构造函数中,我进行调用以获取存储库(根据“带有视图的Android房间”教程)。我的存储库负责附加firestore侦听器
我正在尝试优化我的应用程序在Firesbase上的读取次数,并回顾我使用快照监控实时更改的方式。假设我有一个快照,返回10个最新文档,如下所示: 医生说 每次查询结果更改时(即添加、删除或修改文档时),快照处理程序都会收到一个新的查询快照。 这是否意味着每次查询更改时,我都将被计费10次读取?在这个例子中,如果添加了一个新城市(所以使用最新的“日期添加”,所以在查询中排在第一位),它将是1(只是新
问题内容: 我需要连续监视数据库行以检查更改(更新)。如果其他来源进行了某些更改或更新,则应在我的应用程序上触发该事件(我正在使用WCF)。有什么办法可以连续监听数据库行中的更改吗? 我可能拥有更多事件来监视同一表中的不同行。在性能方面有什么问题。我正在使用C#Web服务监视SQL Server后端。 问题答案: 不久前,我有一个非常相似的要求,我使用CLR SP将数据推送到消息队列中来解决了这个