Android & Kiến trúc

Di trú bản nháp Android khi đổi cấu trúc dữ liệu

Nâng cấp bản lưu cũ có phiên bản và bảo toàn nội dung người dùng đang nhập.

Vấn đề nghiên cứuNâng cao6 phút đọcPython

Thích và đánh giá Bình luận và hỏi đáp
Chuyển v1 → v2; chạy lại v2 giữ nguyên. Phiên bản chưa hỗ trợ phải báo lỗi.
Chuyển v1 → v2; chạy lại v2 giữ nguyên. Phiên bản chưa hỗ trợ phải báo lỗi. Mở hình lớn ↗

1. Phân biệt trạng thái và dữ liệu dài hạn

Bản nháp cần khôi phục sau lần cài bản cập nhật là dữ liệu do người dùng tạo. Định dạng lưu nên có phiên bản, để bản mới biết cách đọc dữ liệu cũ. Các thông tin giao diện ngắn hạn như vị trí cuộn có thể dùng một cơ chế khác. Chọn ranh giới này theo yêu cầu vòng đời và thời gian giữ dữ liệu.

2. Viết phép đổi có thể kiểm tra

Ví dụ phiên bản 1 lưu toàn bộ nội dung ở trường text. Phiên bản 2 tách tiêu đề và nội dung, đặt tiêu đề rỗng và giữ nguyên chữ đã gõ. Nếu thiếu trường hoặc kiểu dữ liệu không đúng, báo lỗi đọc có kiểm soát và giữ nguồn gốc để khôi phục. Phiên bản chưa hỗ trợ cần đường xử lý riêng.

3. Kiểm chứng bằng mẫu lưu trước và sau

Chạy mẫu với bản cũ, bản mới và phiên bản chưa biết. Bản cũ chuyển đúng sang dạng mới, chạy lại trên kết quả không làm đổi dữ liệu. Thuộc tính này hữu ích khi ứng dụng có thể thử đọc lại sau lần cập nhật bị gián đoạn. Mẫu Python minh họa định dạng dữ liệu và không cần bộ công cụ Android.

Chạy ví dụ bằng python android_di_tru_ban_nhap.py.

Môi trường thực hành. Python 3.10 trở lên. Ví dụ dùng thư viện chuẩn Python. Đây là mô hình Python để kiểm tra logic trước khi chuyển sang dự án Android.

Python · android_di_tru_ban_nhap.pyTải mã nguồn
def di_tru(du_lieu):
    phien_ban = du_lieu.get("version")
    if phien_ban == 1 and isinstance(du_lieu.get("text"), str):
        return {"version": 2, "title": "", "body": du_lieu["text"]}
    if phien_ban == 2 and all(isinstance(du_lieu.get(k), str) for k in ("title", "body")):
        return du_lieu.copy()
    raise ValueError("Bản nháp không đọc được")

moi = di_tru({"version": 1, "text": "Đề cương bài giảng"})
assert moi == {"version": 2, "title": "", "body": "Đề cương bài giảng"}
assert di_tru(moi) == moi
try:
    di_tru({"version": 3})
except ValueError:
    print("Giữ nội dung khi nâng cấp và nhận diện phiên bản chưa hỗ trợ.")
else:
    raise AssertionError("Phải báo lỗi đọc")

4. Thử gián đoạn và dữ liệu biên

Tạo bản nháp rỗng, nội dung Unicode, trường thiếu và phiên bản mới hơn ứng dụng đang chạy. Khi lưu lại, dùng giao dịch hoặc cơ chế ghi thay thế an toàn của tầng lưu trữ. Chỉ xóa bản cũ sau khi kiểm chứng rằng bản mới đọc lại được, và kiểm tra tình huống người dùng cập nhật ứng dụng khi còn bản nháp.

Đọc thêm Hướng dẫn kiến trúc ứng dụng Android.