Tôi đã triển khai một BackupAgentHelper
bằng cách sử dụng được cung cấp FileBackupHelper
để sao lưu và khôi phục cơ sở dữ liệu gốc mà tôi có. Đây là cơ sở dữ liệu bạn thường sử dụng cùng ContentProviders
và nằm trong đó /data/data/yourpackage/databases/
.
Một người sẽ nghĩ rằng đây là một trường hợp phổ biến. Tuy nhiên, tài liệu không rõ phải làm gì: http://developer.android.com/guide/topics/data/backup.html . Không có BackupHelper
cụ thể cho những cơ sở dữ liệu điển hình này. Do đó, tôi đã sử dụngFileBackupHelper
, trỏ nó đến tệp .db của tôi trong " /databases/
", giới thiệu các khóa xung quanh bất kỳ thao tác db nào (chẳng hạn như db.insert
) trong của tôi ContentProviders
, và thậm chí đã thử tạo thư mục " /databases/
" trước đó onRestore()
vì nó không tồn tại sau khi cài đặt.
Tôi đã thực hiện một giải pháp tương tự cho SharedPreferences
thành công trong một ứng dụng khác trước đây. Tuy nhiên, khi tôi kiểm tra triển khai mới của mình trong trình giả lập-2.2, tôi thấy một bản sao lưu đang được thực hiện LocalTransport
từ các bản ghi, cũng như quá trình khôi phục đang được thực hiện (và onRestore()
được gọi). Tuy nhiên, bản thân tệp db không bao giờ được tạo.
Lưu ý rằng đây là tất cả sau khi cài đặt và trước khi khởi chạy ứng dụng lần đầu tiên, sau khi quá trình khôi phục đã được thực hiện. Ngoài ra, chiến lược thử nghiệm của tôi dựa trên http://developer.android.com/guide/topics/data/backup.html#Testing .
Cũng xin lưu ý rằng tôi không nói về một số cơ sở dữ liệu sqlite mà tôi tự quản lý, cũng không nói về việc sao lưu vào SDcard, máy chủ riêng hoặc nơi khác.
Tôi đã thấy đề cập trong tài liệu về cơ sở dữ liệu khuyên sử dụng tùy chỉnh BackupAgent
nhưng nó có vẻ không liên quan:
Tuy nhiên, bạn có thể muốn mở rộng BackupAgent trực tiếp nếu bạn cần: * Sao lưu dữ liệu trong cơ sở dữ liệu. Nếu bạn có cơ sở dữ liệu SQLite mà bạn muốn khôi phục khi người dùng cài đặt lại ứng dụng của mình, bạn cần tạo một BackupAgent tùy chỉnh để đọc dữ liệu thích hợp trong quá trình sao lưu, sau đó tạo bảng và chèn dữ liệu trong quá trình khôi phục.
Làm ơn nói rõ một chút.
Nếu tôi thực sự cần phải tự mình làm điều đó đến cấp SQL, thì tôi lo lắng về các chủ đề sau:
Mở cơ sở dữ liệu và giao dịch. Tôi không biết làm cách nào để đóng chúng khỏi một lớp singleton như vậy bên ngoài quy trình làm việc của ứng dụng của tôi.
Làm thế nào để thông báo cho người dùng rằng một bản sao lưu đang được tiến hành và cơ sở dữ liệu bị khóa. Có thể mất nhiều thời gian, vì vậy tôi có thể cần hiển thị thanh tiến trình.
Cách thực hiện tương tự trên khôi phục. Theo tôi hiểu, việc khôi phục có thể xảy ra ngay khi người dùng đã bắt đầu sử dụng ứng dụng (và nhập dữ liệu vào cơ sở dữ liệu). Vì vậy, bạn không thể cho rằng chỉ khôi phục dữ liệu dự phòng tại chỗ (xóa dữ liệu trống hoặc dữ liệu cũ). Bạn sẽ phải tham gia bằng cách nào đó, điều này đối với bất kỳ cơ sở dữ liệu không tầm thường nào là không thể do id của.
Cách làm mới ứng dụng sau khi quá trình khôi phục hoàn tất mà không khiến người dùng gặp khó khăn tại một số điểm - bây giờ - không thể truy cập.
Tôi có thể chắc chắn rằng cơ sở dữ liệu đã được nâng cấp khi sao lưu hoặc khôi phục không? Nếu không, lược đồ mong đợi có thể không khớp.