2017-04-02 304 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); 
     }) 
}