2013-05-29 37 views
6

Tôi hiện đang sử dụng angularJS và phonegap để tạo ứng dụng thử nghiệm cho Android/iOS.Cách đồng bộ hóa cơ sở dữ liệu ngoại tuyến với Firebase khi thiết bị trực tuyến?

Ứng dụng chỉ sử dụng dữ liệu văn bản được lưu trữ trong cơ sở dữ liệu Firebase. Tôi muốn ứng dụng có cơ sở dữ liệu cục bộ của riêng mình (được sử dụng khi thiết bị ngoại tuyến) và đôi khi (khi thiết bị đang trực tuyến) đồng bộ hóa với cơ sở dữ liệu Firebase.

Chế độ ngoại tuyến sử dụng API lưu trữ của phonegap/cordova. Tôi có thể kiểm tra trạng thái trực tuyến của thiết bị và sao lưu cơ sở dữ liệu trực tuyến định kỳ không?

Bất kỳ manh mối nào về cách tôi có thể đạt được điều này? Lần cuối cùng một câu hỏi tương tự được hỏi, câu trả lời là "chưa" ... (here) ... bởi vì nó tập trung vào một tính năng Firebase giả định.

Trả lời

10

Nếu Firebase trực tuyến lúc khởi động và tạm thời mất kết nối, sau đó kết nối lại, sau đó nó sẽ đồng bộ hóa dữ liệu cục bộ. Vì vậy, trong nhiều trường hợp, sau khi Firebase trực tuyến, bạn chỉ cần tiếp tục đẩy tới Firebase trong thời gian ngừng hoạt động.

Để sử dụng ngoại tuyến thực sự, có thể bạn sẽ muốn theo dõi trạng thái của thiết bị và cũng xem .info/connected để biết khi nào Firebase kết nối.

new Firebase('URL/.info/connected').on('value', function(ss) { 
    if(ss.val() === null) /* firebase disconnected */ 
    else /* firebase reconnected */ 
}); 

Cách để đạt được điều này với công cụ căn cứ hỏa lực hiện tại, cho đến khi nó hỗ trợ lưu trữ ẩn sự thật, sẽ

  1. giữ dữ liệu cục bộ đơn giản và nhỏ
  2. khi thiết bị đi kèm trực tuyến, chuyển đổi dữ liệu được lưu trữ cục bộ thành JSON
  3. sử dụng set() để lưu dữ liệu vào Firebase theo đường dẫn thích hợp

Ngoài ra, nếu ứng dụng tải trong khi thiết bị ngoại tuyến, vì một lý do nào đó, bạn có thể "căn" Firebase bằng cách gọi set() để "khởi tạo" dữ liệu. Sau đó, bạn có thể sử dụng Firebase như bình thường (giống như khi trực tuyến) cho đến khi nó trực tuyến tại một thời điểm nào đó trong tương lai (bạn cũng muốn lưu trữ bản sao cục bộ của mình để xử lý trường hợp không bao giờ thực hiện).

Rõ ràng, càng đơn giản càng tốt. Sửa đổi đồng thời, giới hạn kích thước lưu trữ cục bộ và nhiều yếu tố khác sẽ nhanh chóng tích lũy để làm cho bất kỳ giải pháp lưu trữ ngoại tuyến phức tạp và tốn thời gian.

+0

Cảm ơn bạn đã biết các mẹo, tôi sẽ nhanh chóng thực hiện điều này. Điều tiếp theo cần làm là có thể bắt đầu ngoại tuyến ... –

+0

Xin chào, tôi không hiểu ý của bạn là gì ... bạn có thể "thủ" Firebase bằng ... Thx – david

+0

Bất kỳ giải pháp nào để xử lý xác thực Firebase ? Caching mã thông báo cục bộ và cho phép đăng nhập mà không cần treo ứng dụng? – MrYellow

0

Sau một thời gian, tôi muốn thêm 0,02 đến @ câu trả lời Kato của:

Opt để gọi snapshot.exists() thay vì gọi snapshot.val() === null. Khi số documentation chỉ ra, tồn tại() sẽ hiệu quả hơn một chút so với so sánh snapshot.val() thành null.

Và nếu bạn muốn cập nhật dữ liệu, hãy sử dụng phương thức update() thay vì set(), vì phương pháp cuối cùng sẽ ghi đè dữ liệu Firebase của bạn. Bạn có thể đọc thêm here.

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