2013-05-30 81 views
1

我有這樣的樹:如何獲取Firebase上更改/添加/刪除的記錄?

根/ companyId /客戶和根/ companyId /訂單

及以下則3客戶,如

根/ companyId /客戶/ IdCustomer/CustomerData

我附加到所有事件:

[sharedInstance.root observeEventType:FEventTypeChildChanged withBlock:^(FDataSnapshot *snapshot) { 
    NSLog(@"Data get: %@", snapshot.value); 
}]; 
[sharedInstance.root observeEventType:FEventTypeChildRemoved withBlock:^(FDataSnapshot *snapshot) { 
    NSLog(@"Removed: %@", snapshot.value); 
}]; 
[sharedInstance.root observeEventType:FEventTypeChildAdded withBlock:^(FDataSnapshot *snapshot) { 
    NSLog(@"Added: %@", snapshot.value); 
}]; 

在根/公司。

我需要知道什麼時候表更改,哪些記錄。

然而,FEventTypeChildChanged讓我滿子樹,即使只有1客戶的變化。 FEventTypeChildRemoved僅在刪除客戶樹時觸發,而不是在刪除單個客戶時觸發。 FEventTypeChildChanged在刪除時觸發,但不顯示已刪除的記錄,但不顯示已刪除記錄的完整子樹。在添加新記錄時也會觸發,但是FEventTypeChildAdded不會觸發。

如果我只監視「客戶」樹並更改單個值,請獲取 FEventTypeChildChanged中的所有客戶列表。我只想要改變的單個記錄。

所以,很明顯,我不明白這是如何連線。我希望獲得每個表的每個記錄的添加,更改,del事件,不會獲得整個子樹並重新處理已同步的數據(類似於Firebase儀表板的工作方式)。

回答

4

child_ *事件僅適用於節點的直接子節點。如果你在/ a處添加一個監聽器,然後添加/ a/b,你將會得到一個child_added事件。但是,如果/ a/b已經存在,並且您添加/ a/b/c,則只會收到一個child_changed事件,因爲您只在/ a處偵聽,並且未添加/ a/b,它被改變了。

如果你想確切地知道改變了什麼,那麼你應該在你關心的點添加額外的監聽器。在這種情況下,在/ a和/ a/*處。 Firebase旨在允許附加非常大量(數千)的聽衆。

Forge通過在樹中的每個級別附加偵聽器來工作。這樣我們就知道每個級別的變化。

+1

這意味着我在事件中獲取的數據沒有完全下載,但是從服務器中的更改和本地副本重新構建?像一種差異? – mamcx

+0

此外,儀表板的行爲是我喜歡的。如何完成任何提示?正在使用隊列? (順便說一下,我運行隊列演示,沒有發生...) – mamcx

+0

我不知道我明白。你在說Forge嗎?你喜歡哪種行爲? –