Điều gì sẽ xảy ra với SharedPreferences khi cập nhật Ứng dụng Android?


84

Tôi đã lưu trữ cài đặt người dùng trong SharedPreferences trong Ứng dụng của mình. Điều gì sẽ xảy ra với SharedPreferences khi tôi cập nhật Ứng dụng qua Cửa hàng Google Play lên phiên bản mới của Ứng dụng?

SharedPrefernces vẫn ở đó sau khi cập nhật hay chúng sẽ bị xóa?

Cho đến nay tôi vẫn chưa tìm thấy câu trả lời trên web hoặc Stackoverflow (tôi có thể tìm kiếm sai từ khóa không?).

Bạn có thể chỉ cho tôi một số liên kết mà họ mô tả quá trình này không?

Chỉnh sửa: Trong khi đó, tôi cũng tìm thấy một câu trả lời khác: Hành vi SharedPreferences khi Cập nhật / Gỡ cài đặt

Chỉnh sửa 2: Trước đây khá lâu khi lần đầu tiên tôi hỏi câu hỏi này, gần đây tôi đã biết rằng kể từ Android 6.0 (API 23), bạn cũng có thể sử dụng chức năng sao lưu tự động để bảo mật các tùy chọn được chia sẻ của bạn như được mô tả bởi Google tại đây . Chỉ cần thêm allowBackup="true"vào AndroidManifest.xmltệp của bạn .

Câu trả lời:


70

Cristian ở đây nói: dữ liệu Ứng dụng của bạn sẽ vẫn còn khi người dùng cài đặt các bản cập nhật.

Nhưng nó phải giống package namevới bản cập nhật của Ứng dụng trước đó.

EboMike trong Cảnh báo người dùng Android rằng cập nhật ứng dụng có thể dẫn đến mất dữ liệu từ phiên bản ứng dụng cũ? nói:

Thành thật mà nói, mất dữ liệu do nâng cấp là không thể chấp nhận được.

Chỉnh sửa :

Thông thường , SharedPreferences (cũng như dữ liệu người dùng khác) sẽ được lưu giữ trong quá trình cập nhật, nhưng đôi khi, do một số vấn đề " không xác định ", dữ liệu có thể bị mất và tôi đoán nó nằm ngoài tầm kiểm soát của bạn. Vì vậy, bạn có thể đơn giản tin rằng SharedPreferences sẽ được giữ lại ( xem tại đây ).

Vì vậy, nếu bạn muốn tránh xóa dữ liệu của người dùng trong quá trình nâng cấp, bạn phải lưu dữ liệu chính trong bộ nhớ ngoài (đây có thể là phương tiện lưu trữ di động, chẳng hạn như thẻ SD hoặc bộ nhớ trong, không thể tháo rời,) và không riêng tư cho Ứng dụng của bạn, hoặc ít nhất là để người dùng sao lưu dữ liệu trước khi nâng cấp. Sau đó, trong lần đầu tiên chạy Ứng dụng (đã nâng cấp) của bạn, hãy kiểm tra xem có tệp sao lưu nào trong bộ nhớ ngoài hay không.

Nếu bạn muốn biết Những điều gì phải / có thể xảy ra khi nâng cấp Ứng dụng? , Tôi không bất kỳ mô tả tốt cho this.It rất phức tạp và tương đối với Android Security, Application signing, copy protectionvà khác topics.I có nghĩa rằng nếu bạn thay đổi trạng thái của ứng dụng của bạn trong bất kỳ lĩnh vực trên, nó gây ra kết quả khác nhau.
Ví dụ: nếu bạn CHANGED COPY PROTECTION FROM ON to OFF OR OFF to ON, Ứng dụng của bạn sẽ được cập nhật nhưng khiến tất cả các tùy chọn được chia sẻ của bạn bị mất, không thể truy cập tệp và ...
Mặc dù bạn phải quan tâm đến các điều kiện gây ra Ứng dụng mới của bạn being considereddưới dạng bản cập nhật cho Ứng dụng trước đó (xem Những điều không thể thay đổi ).

Ngoài ra, bạn cũng phải quan tâm đến mã của mình, nó có thể gây ra việc xóa dữ liệu của cơ sở dữ liệu của bạn (xem ứng dụng cập nhật với SQLite được tải sẵn ).

Nhưng cuối cùng, nếu cẩn thận, bạn có thể nói:

Quá trình cập nhật chỉ thay thế tệp apk (và vì vậy, những gì có trong đó, chẳng hạn như tệp có thể kéo, ...) và không thay đổi cơ sở dữ liệu, tài liệu tham khảo được chia sẻ và bất kỳ tệp nào khác được tạo trong thời gian chạy (có thể trong trường hợp này, Ứng dụng mới được cài đặt với UID bằng với UID của Ứng dụng trước đó).

Bạn có thể xem các trang này để biết thêm chi tiết:

Cứu giúp!? Việc cập nhật ứng dụng của chúng tôi trên thị trường sẽ xóa các SharedPreferences đã lưu.
Bảo vệ chống sao chép thị trường hoàn toàn phá vỡ quyền truy cập tệp sau khi cập nhật
Ai đó có thể giải thích quy trình cập nhật Ứng dụng không?


Cảm ơn, đối với tôi, có vẻ như SharedPreferences NÊN được giữ nguyên. Nhưng không có mô tả chính thức về quá trình này?
Bruno Bieri

@viperbone quy trình nào? clareing sharedpreferences? hay nâng cấp ứng dụng?
hasanghaforian

Quy trình nâng cấp ứng dụng. Những điều phải / có thể xảy ra khi nâng cấp Ứng dụng.
Bruno Bieri

@viperbone Vui lòng xem lại câu trả lời của tôi. Tôi đã bổ sung thêm chi tiết.
hasanghaforian

Một lưu ý khác: hãy đảm bảo rằng tên tùy chọn được chia sẻ là giống nhau giữa các lần nâng cấp! Tôi có tên gọi khác nhau giữa các phiên bản, vì vậy phiên bản mới đã không được chọn lên các ưu đãi tiết kiệm được từ phiên bản trước ... lãng phí cả một buổi sáng để gỡ lỗi này ... :-(
henry000dev

7

Sau khi gỡ lỗi trong hơn 4 giờ, tôi phát hiện ra rằng tôi đang lưu một mô hình dưới dạng chuỗi bằng cách tuần tự hóa nó. Một lớp có thể tuần tự hóa có một id duy nhất theo tên serialVersionUID , được đặt theo mặc định trong thời gian chạy và id được tính theo tên của lớp, giao diện và tên biến. Tôi phát hiện ra mình đã thay đổi lớp mô hình, thêm một biến và sau đó cập nhật ứng dụng. Vì lớp bây giờ đã được thay đổi nên một serialVersionUID mới đã được đặt và do đó khi cập nhật, nó không thể giải mã chuỗi và tạo mô hình và đang cung cấp java.io.InvalidClassException

Đặt serialVersionUID rõ ràng để tránh sự cố này

static final long serialVersionUID = 42L;

1
Nhưng hãy đảm bảo rằng các thay đổi của bạn tương thích nếu không bạn có thể gặp phải các lỗi wierd.
mjaggard

5

Tôi nghĩ rằng khi tôi cập nhật ứng dụng của mình lần trước qua Google Play, sharedPreferences không bị ảnh hưởng.
Tôi đã sử dụng chúng để tự động đăng nhập và sau khi cập nhật, nó đã làm như vậy.
Đó là một tháng trước, trí nhớ của tôi có thể mờ đi nên tốt hơn là nên nghe ý kiến ​​của người khác.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.