2016-01-12 26 views
6

Nếu tôi có danh sách 50.000 mục được lưu trữ trong tham chiếu firebase của tôi và 5 mục đã được thêm vào danh sách đó kể từ lần cuối cùng khách hàng trực tuyến và đang nghe, cuộc gọi lại nào tôi sẽ phải sử dụng rằng nó chỉ được kích hoạt cho 5 mục mới đã được thêm vào?Firebase onChildĐược thêm vào dữ liệu mới

Tôi đã bật tính năng kiên trì ngoại tuyến trên ứng dụng khách của mình với Firebase.getDefaultConfig().setPersistenceEnabled(true);. Tôi có một người nghe bị ràng buộc với một hoạt động nghe cho trẻ em được thêm vào một tham chiếu. Mọi hoạt động được tạo ra onChildAdded được gọi cho tất cả dữ liệu trong tham chiếu. Có thể đặt onChildAddedonChildRemoved chỉ được gọi cho "diff" giữa bộ nhớ cache cục bộ của tôi và dữ liệu trên máy chủ firebase không? Hoặc nếu điều đó là không thể, thì chỉ kích hoạt những cuộc gọi lại onChild* sau lần cập nhật mới nhất từ ​​firebase?

+0

Các bạn đã cố gắng sử dụng callback onComplete cho [update()] (https://www.firebase.com/docs/web/api/firebase/update.html)? –

+0

Từ tài liệu android, có vẻ như updateChildren() tương tự như setValue(). Tôi không biết cách sử dụng nó để tìm ra những gì tôi đang cố gắng làm. Tôi đã thêm một ví dụ cho câu hỏi mà có thể làm cho những gì tôi đang cố gắng để đạt được rõ ràng hơn. –

Trả lời

9

Mỗi lần hoạt động được tạo trênChildAdded được gọi cho tất cả dữ liệu trong tham chiếu. Có thể thực hiện onChildAdded và onChildRemoved được gọi chỉ cho "diff" giữa bộ nhớ cache cục bộ của tôi và dữ liệu trên máy chủ firebase không?

Không, điều này là không thể. Từ documentation on event types: child_added

được kích hoạt một lần cho mỗi đứa trẻ hiện tại và sau đó một lần nữa mỗi khi một đứa trẻ mới được thêm vào các đường dẫn cụ thể

Bây giờ trở lại câu hỏi ban đầu của bạn:

Tôi sẽ phải sử dụng tính năng gọi lại nào để nó chỉ được kích hoạt cho 5 mục mới đã được thêm vào?

Đó sẽ là:

ref.limitToLast(5)... 

Nhưng điều này đòi hỏi bạn phải biết có bao nhiêu mục đã được thêm vào danh sách, vì bạn đã nghe qua.

Giải pháp thông thường hơn là để theo dõi các mục cuối cùng bạn đã nhìn thấy và sau đó sử dụng startAt() để bắt đầu bắn các sự kiện từ nơi bạn đã qua:

ref.orderByKey().startAt("-Ksakjhds32139")... 

Bạn muốn sau đó giữ phím cuối cùng bạn đã thấy trong các tùy chọn được chia sẻ.

Tương tự như vậy bạn có thể giữ thời gian qua hoạt động này đã được nhìn thấy với:

long lastActive = new Date().getTime(); 

Sau đó, thêm một timestamp với Firebase.ServerValue.TIMESTAMP cho từng hạng mục và sau đó:

ref.orderByChild("timetstamp").startAt(lastActive+1)... 
+0

Giải pháp này cũng có thể kích hoạt các sự kiện ChildChanged và childRemoved? –

+0

Mặc dù câu trả lời của Frank là TUYỆT ĐỐI TUYỆT ĐỐI, tôi nghĩ bạn nên xem xét lại logic để xử lý CREATE, UPDATE và DELETE (dựa trên các hành động mà anh ta gợi ý). Dường như với tôi rằng bạn có thể xem xét một tạp chí dựa trên Firebase dựa trên các hành động của C (R) UD (với logic hết hạn/loại bỏ) để nắm bắt mọi thứ xảy ra khi các thiết bị khác nhau không trực tuyến. – seanpj

+0

Có, một FIFO sự kiện kể từ lần truy vấn cuối cùng sẽ là tối ưu, nhưng có vẻ như tôi sẽ sử dụng childEventListener như vậy. Khi chụp các sự kiện, tôi sẽ bỏ qua dữ liệu đã được nhìn thấy bằng cách lưu trữ nó cục bộ. –

1

Bạn nên sử dụng on('child_changed'). Thông thường, on() được sử dụng để nghe các thay đổi dữ liệu tại một vị trí cụ thể. Tuy nhiên, on('child_changed') thông báo cho bạn

khi dữ liệu được lưu trữ trong một đứa trẻ (hoặc bất kỳ hậu duệ của nó) thay đổi.

Nó sẽ chuyển ảnh chụp nhanh dữ liệu đến cuộc gọi lại có chứa nội dung con mới. Hãy nhớ rằng một sự kiện child_changed duy nhất có khả năng thể hiện nhiều thay đổi đối với trẻ.

+2

Chẳng phải anh ta trong trường hợp này sẽ nhận được một danh sách của tất cả 50000 + 5 mục không phải anh ta đang yêu cầu (xem đoạn cuối của câu hỏi). – seanpj

+1

Bạn nói đúng, tôi cho rằng anh ấy cũng có thể sử dụng [limitToLast (x)] (https://www.firebase.com/docs/web/api/query/limittolast.html) để nhận được các cập nhật X mới nhất cho trẻ em. –

Các vấn đề liên quan