Bản sao lưu của tôi đã làm mất mọi bức ảnh

Tôi đã xây dựng một nút sao lưu cho một ứng dụng theo dõi tâm trạng ngoại tuyến.

Nó xuất dữ liệu ra một tệp JSON. Người dùng có thể lưu lại và chuyển nó sang điện thoại mới. Mọi thứ có vẻ thật hoàn hảo.

Sau đó, tôi thay đổi package ID của ứng dụng. Tôi đã thử cài đặt mới trên một thiết bị khác và khôi phục bản sao lưu.

Các mục văn bản đã quay trở lại. Nhưng mọi bức ảnh đều biến mất.

Tôi nhận ra sai lầm của mình. Bản sao lưu đó không phải là một bản sao lưu thực sự. Nó chỉ là một danh sách các con trỏ trỏ đến những tệp không còn tồn tại nữa.

Ứng dụng lưu trữ ảnh trên đĩa. Cơ sở dữ liệu chỉ giữ đường dẫn tệp.

Đường dẫn trông như thế này: file:///data/user/0/com.example.app/files/entry_media/image.jpg

Khi tôi xuất tệp JSON, tôi chỉ lưu đường dẫn đó. Trên cùng một thiết bị, việc nhập dữ liệu vẫn hoạt động vì các tệp vẫn còn ở đó.

Trên một thiết bị mới, những đường dẫn đó không trỏ vào đâu cả. Người dùng sẽ thấy các hình thu nhỏ (thumbnails) bị lỗi và nghĩ rằng ứng dụng đã xóa mất những kỷ niệm của họ.

Nếu bản xuất của bạn chỉ chứa các đường dẫn tệp, bạn không có một bản sao lưu có tính di động. Bạn chỉ có một bản sao lưu chỉ hoạt động trên chính chiếc máy vốn dĩ không cần đến nó.

Một bản sao lưu thực sự phải chứa dữ liệu thực tế.

Tôi đã thay đổi quy trình. Giờ đây, quá trình xuất sẽ đọc từng bức ảnh và chuyển đổi nó thành một chuỗi Base64 bên trong tệp JSON.

Cách tiếp cận này có những sự đánh đổi: • Kích thước tệp tăng thêm khoảng 33 phần trăm. • Các thư viện lớn yêu cầu nhiều bộ nhớ hơn trong quá trình xuất.

Tôi chọn sự chính xác thay vì kích thước tệp. Một bản sao lưu lớn vẫn có ích. Một bản sao lưu nhỏ xíu mà làm mất hết hình ảnh thì vô giá trị.

Tôi cũng thay đổi cách xử lý việc nhập dữ liệu để đảm bảo tốc độ và sự an toàn:

  1. Viết tất cả ảnh vào đĩa của thiết bị mới trước. Việc này diễn ra bên ngoài giao dịch cơ sở dữ liệu (database transaction) để giữ tốc độ nhanh.
  2. Chạy một giao dịch cơ sở dữ liệu duy nhất để liên kết các đường dẫn cục bộ mới với các mục dữ liệu.

Tôi cũng xây dựng hệ thống theo cơ chế "fail soft" (lỗi nhẹ). Nếu một bức ảnh bị thiếu hoặc không thể đọc được, ứng dụng sẽ bỏ qua nó và chuyển sang ảnh tiếp theo. Một hình ảnh bị lỗi không nên làm hỏng toàn bộ quá trình khôi phục.

Bài học rút ra:

  • Kiểm thử đúng cách. Xuất dữ liệu trên một thiết bị, xóa sạch nó, rồi nhập dữ liệu trên một bản cài đặt mới hoàn toàn. Việc nhập lại trên cùng một thiết bị sẽ che giấu các lỗi.
  • Hãy mang theo các byte dữ liệu. Nếu dữ liệu cần phải tồn tại sau khi đổi thiết bị, hãy di chuyển dữ liệu thực tế, chứ không phải địa chỉ của nó.

Nguồn: https://dev.to/diven_rastdus_c5af27d68f3/my-offline-apps-backup-lost-every-photo-on-a-new-phone-3d36