2017-04-02 283 views
0

读取新的事件,我中途在我的iOS应用程序实现核心数据做时,我意识到,火力地堡有将几乎模仿什么,我试图完成的全部时间离线功能。只有从火力地堡数据库

在我的数据库,其中的结构为这样:

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

我想在本地存储已经获取用户的所有事件,这样我就不用看了所有他们每单我需要得到一个组的事件。现在我想我只是坚持使用Firebase的离线功能而不是使用核心数据,但我有一个关于如何有效地从数据库中读取事件的问题。

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

console

我的问题是:我怎么只能读取从一组新的事件?我实施Core Data的原因是,我可以缓存已获取的事件,但我不确定如何确保不重新读取数据。

+0

你能说清楚为什么你想要保持所有的事件在本地?它们已经在Firebase数据库中,因此不是本地副本是否重复?如果有很多事件发生,它也可能导致本地存储问题。 – Jay

+0

所以我不必重新读取数据。 – MarksCode

+0

大声笑。谢谢。我得到了那部分。我在问你为什么要重读数据?即什么会导致应用程序重新读取数据?即如果这是一系列事件,那么你可能不需要阅读“旧”事件,因此它们可以被标记为这样。或者也许在活动上有一个日期标记,只是从今天开始阅读活动。只是好奇,因为它有点模糊,以至于每一次读取所有这些文件都意味着什么。 – Jay

回答

0

火力地堡为您提供10MB永久内存来缓存最近提取记录。在正常情况下,10MB是足够的空间。

您需要启用离线功能。

1

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

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); 
     }) 
}