2016-10-22 73 views
14

Tôi nghĩ rằng toàn bộ thời gian khi tôi sử dụng tất cả dữ liệu sau đây cho cuộc hội thoại trò chuyện sẽ khả dụng ngoại tuyến bất cứ lúc nào. Mà bằng cách nào đó không phải là và tất cả các nút được tải từ máy chủ.Firebase: Sự khác nhau giữa setPersistenceEnabled và keepSynced là gì?

FirebaseDatabase.getInstance().setPersistenceEnabled(true); 

Sau đó, theo DOCS:

Persistence Hành vi: Bằng cách cho phép kiên trì, bất kỳ dữ liệu mà chúng ta đồng bộ trong khi trực tuyến sẽ được tiếp tục tồn vào đĩa và có sẵn trực tuyến, ngay cả khi chúng ta khởi động lại ứng dụng. Điều này có nghĩa là ứng dụng của chúng tôi sẽ hoạt động vì nó sẽ trực tuyến bằng cách sử dụng dữ liệu cục bộ được lưu trữ trong bộ nhớ cache.

Nếu dữ liệu sẽ khả dụng khi ngoại tuyến setPersistenceEnabled(true);, tại sao tôi cần keepSynced(true)?

DatabaseReference r = FirebaseDatabase.getInstance().getReference("chat/roomid"); 
r.keepSynced(true); 

Trả lời

14

Ứng dụng khách cơ sở dữ liệu Firebase trong ứng dụng của bạn có thể lưu dữ liệu từ hai nơi: trong bộ nhớ và/hoặc trên đĩa.

  1. Khi bạn đính kèm một người nghe, nó sẽ đồng bộ hóa dữ liệu từ cơ sở dữ liệu với đại diện bộ nhớ trong ứng dụng của bạn.
  2. Nếu bạn đã bật tính kiên trì, dữ liệu tự động cũng được lưu trên đĩa.
  3. Khi bạn tách người nghe cuối cùng khỏi một vị trí, dữ liệu cho vị trí đó bị xóa khỏi bộ nhớ. Nhưng nó không bị xóa khỏi đĩa.

Khi bạn giữ một vị trí được đồng bộ hóa, khách hàng về cơ bản sẽ đưa người nghe trống vào vị trí đó. Vì vậy, dữ liệu trong ứng dụng sẽ luôn được cập nhật với những gì trong cơ sở dữ liệu trên máy chủ (miễn là có kết nối mạng). Nếu bạn chưa bật tính kiên trì, dữ liệu sẽ chỉ được cập nhật trong bộ nhớ. Nếu bạn đã bật tính kiên trì, nó cũng sẽ được cập nhật trên đĩa.

Mặc dù phổ biến nhất là sử dụng keepSynced với sự kiên trì, cũng có các trường hợp sử dụng mà không cần phải kiên trì.

Ví dụ: nếu bạn có ứng dụng chi tiết chính, nơi bạn thường xuyên thoát ra từ danh sách tên mục đến chi tiết của từng mục. Trong trường hợp đó, việc giữ danh sách các tên mục được đồng bộ sẽ giúp bạn không phải tải lại dữ liệu đó khi người dùng quay lại từ màn hình chi tiết.

Bạn cũng có thể chỉ đơn giản là giữ người nghe trên dữ liệu, về cơ bản những gì keepSynced thực hiện sau hậu trường.

+0

FirebaseDatabase.getInstance(). SetPersistenceEnabled (true); không làm cho trò chuyện có sẵn cho ngoại tuyến – Gattsu

+0

@ maveň, kiểm tra câu trả lời bên dưới và làm rõ của tôi trên đó. – mradzinski

+0

@Frank van Puffelen nếu kiên trì được kích hoạt và ứng dụng bị chấm dứt, sau đó ứng dụng chạy Firebase sao chép toàn bộ cơ sở dữ liệu từ máy chủ sang bộ nhớ và đĩa, hay sao chép các mục đó từ máy chủ đã thay đổi? I E. nó có thể cho biết đồng bằng giữa dữ liệu trên đĩa thiết bị và dữ liệu trong máy chủ và chỉ di chuyển dữ liệu delta đến thiết bị cầm tay là gì? – Gruntcakes

0

Theo Firebase documentation

Theo mặc định, khách hàng căn cứ hỏa lực sẽ giữ cho dữ liệu trong bộ nhớ trong khi ứng dụng của bạn đang chạy, nhưng không phải khi nó được khởi động lại. Bằng cách đặt giá trị này thành true, dữ liệu sẽ được lưu giữ trên thiết bị (đĩa) lưu trữ và do đó sẽ khả dụng trở lại khi ứng dụng được khởi động lại (ngay cả khi không có kết nối mạng tại thời điểm đó). Lưu ý rằng phương thức này phải được gọi trước khi tạo tham chiếu Firebase đầu tiên của bạn và chỉ cần được gọi một lần cho mỗi ứng dụng.Nếu ứng dụng của bạn sử dụng Xác thực Firebase, ứng dụng khách sẽ tự động duy trì mã thông báo xác thực của người dùng trên các lần khởi động lại, ngay cả khi không có sự kiên trì được bật. Nhưng nếu mã thông báo xác thực đã hết hạn khi ngoại tuyến và bạn đã bật tính năng lưu giữ lâu bền, ứng dụng sẽ tạm dừng ghi lại cho đến khi bạn xác thực lại thành công (hoặc gọi hàm unauth) để ngăn việc gửi của bạn không được xác thực và không thành công do các quy tắc bảo mật.

Lưu ý rằng dữ liệu sẽ vẫn tồn tại trên đĩa và khả dụng khi ứng dụng khởi động lại. Nếu bạn nhìn vào số life cycle of an Activity, bạn sẽ thấy rằng một hoạt động dừng lại khi bạn chuyển sang hoạt động khác. Vì vậy, miễn là ứng dụng của bạn vẫn mở và người dùng chỉ điều hướng đến các hoạt động khác, dữ liệu sẽ vẫn tiếp tục tồn tại.

Nhưng đừng nói gì về việc giết ứng dụng của bạn và lưu giữ dữ liệu. Đó là lý do tại sao bạn cần keepSynced():

Bằng cách gọi keepSynced (true) vào một vị trí, dữ liệu cho vị trí đó sẽ tự động được tải về và lưu giữ trong sync, ngay cả khi không nghe được gắn cho vị trí đó. Ngoài ra, trong khi một vị trí được giữ đồng bộ hóa, nó sẽ không được gỡ bỏ khỏi bộ nhớ cache đĩa liên tục.

Pay attencion khi nó nói "trong khi vị trí được giữ đồng bộ hóa, nó sẽ không bị đuổi khỏi bộ nhớ cache đĩa dai dẳng", điều này có nghĩa rằng nếu bạn không sử dụng keepSynced(true) dữ liệu của bạn có thể là cách ửng đỏ khi ứng dụng bị giết/đóng cửa.

Vì vậy, để duy trì và tiếp tục với dữ liệu sau khi ứng dụng của bạn bị giết, bạn cần phải sử dụng cả hai FirebaseDatabase.getInstance().setPersistenceEnabled(true);keepSynced(true).

+2

Chỉ cần làm rõ về điều này: '' 'keepSynced (true)' '' nên được gọi ra từ các tham chiếu mà bạn yêu cầu để đồng bộ (trừ khi yêu cầu của bạn nói rằng bạn muốn giữ toàn bộ thiết bị cơ sở dữ liệu được đồng bộ hóa). Nói cách khác, nếu bạn có một cấu trúc như '' 'users/{userUID}/tasks''' và bạn muốn giữ các tác vụ được đồng bộ hóa thì bạn nên gọi' '' keepSynced (true) '' 'khi tham chiếu đường dẫn đó. – mradzinski

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