仅从Firebase数据库

时间:2017-04-02 08:36:05

标签: ios firebase firebase-realtime-database

当我意识到Firebase具有几乎模仿我一直试图完成的离线功能时,我在iOS应用程序中实现Core Data已经完成了一半。

在我的数据库中,结构如下:

- Users
    - user1
    - user2
- Groups
    - group1
        - members
            - user1
        - events
            - event1_By_Auto_Key
            - event2_By_Auto_Key

我想在本地存储已经被用户提取的所有事件,这样我就不必每次都需要读取所有这些事件来获取组的事件。现在我认为我只是坚持使用Firebase的离线功能而不是使用Core Data,我对如何有效地从数据库中读取事件提出了疑问。

从我的数据库结构中可以看出,事件是使用childByAutoId().setValue(data)方法存储的,这意味着插入时密钥是未知的。所以我给定组的控制台可能如下所示:

console

我的问题是:我怎样才能从群组中读取新事件?我实现Core Data的原因是我可以缓存已经获取的事件,但我不确定如何确保不重新读取数据。

2 个答案:

答案 0 :(得分:1)

您可以使用一些策略。由于生成的id总是在词法上大于任何现有ID,因此您可以在查询中使用startAt()和您已有的最新记录。您只需要跳过与您拥有的最后一个ID匹配的记录。如果在事件中保留时间戳,则可以使用orderByChild()和最后一个时间戳并以1 ms为增量,然后您就不会获得已有的任何记录。它会是这样的:

function getNewEvents(group, arrayOfExistingIds) {
  let lastId = arrayOfExistingIds.sort().pop(),
    ref = admin.database().ref('/Groups/' + group + '/events')
      .orderByKey().startAt(lastId).on('value', function(snap){
        if (snap.key === lastId) return;
        console.log('New record: ' + snap.key);
      })
}

答案 1 :(得分:0)

Firebase为您提供10MB持久内存来缓存最近的提取记录。在正常情况下,10MB就足够了。

您需要启用离线功能。