Android Q: Cơ sở dữ liệu SQLite trong bộ lưu trữ phạm vi


13

Trong Android Q đã giới thiệu tính năng lưu trữ Phạm vi mới , cho biết:

các ứng dụng nhắm mục tiêu Android 10 (API cấp 29) trở lên được cấp quyền truy cập trong phạm vi lưu trữ ngoài hoặc lưu trữ có phạm vi theo mặc định. Các ứng dụng như vậy chỉ có quyền truy cập vào thư mục dành riêng cho ứng dụng trên bộ nhớ ngoài, cũng như các loại phương tiện cụ thể mà ứng dụng đã tạo.

Tôi có ứng dụng của mình tạo cơ sở dữ liệu SQLite trên bộ nhớ ngoài, như vậy khi ứng dụng gỡ cài đặt cơ sở dữ liệu vẫn còn tồn tại và có thể được sử dụng sau này để phục hồi hoặc được sử dụng bên ngoài thiết bị Android (giả sử trong PC)

Làm cách nào để đạt được hiệu ứng tương tự với Android Q? Chính xác hơn nếu cơ sở dữ liệu được lưu trữ trong thư mục công cộng bên ngoài - làm cách nào tôi có thể đọc cơ sở dữ liệu này bằng cách sử dụng tiêu chuẩn SQLiteOpenHelper?


Bạn, không thể, ít nhất là không với SQLite khung hoặc API AndroidX hỗ trợ SQL (API được sử dụng bởi Room). Tôi không thể loại trừ một số giải pháp tối nghĩa bằng thư viện SQLite được biên dịch tùy chỉnh và có lẽ là một bộ mô tả tệp.
CommonsWare

Không không. không-oooo-oooo! Tôi không thể tin rằng, phải có một cách để sử dụng cơ sở dữ liệu SQLite được đặt trong thư mục công cộng ...
Barmaley Red Star

Khi khởi động và tắt ứng dụng, bạn có thể tạo một bản sao của tệp cơ sở dữ liệu. Sử dụng các phương tiện lưu trữ bạn không cần quyền.
blackapps

@blackapps, chắc chắn tôi hiểu tùy chọn này, mặc dù tôi cũng rất vui khi có cách tiếp cận khác: truy cập trực tiếp vào cơ sở dữ liệu SQLite trên bộ nhớ ngoài
Barmaley Red Star

AutoBackup có thể được sử dụng để phục hồi tập tin cơ sở dữ liệu.
nghệ thuật

Câu trả lời:


3

Bạn có thể thử sử dụng giải pháp từ các tài liệu:
https://developer.android.com/training/data-st Storage / compabilities

  • Nhắm mục tiêu Android 9 (API cấp 28) trở xuống.
  • Nếu bạn nhắm mục tiêu Android 10 (API cấp 29) trở lên, hãy đặt giá trị requestLegacyExternalStoragethành truetrong tệp kê khai của ứng dụng:
<manifest ... >
    <!-- This attribute is "false" by default on apps targeting Android 10 or higher. -->
    <application android:requestLegacyExternalStorage="true" ... >
    ...
    </application>
</manifest>

Có vẻ như, đó là giải pháp tốt nhất, mặc dù tôi rất vui khi tìm giải pháp khác. Tôi chỉ sợ một lúc nào đó android:requestLegacyExternalStoragesẽ biến mất ...
Barmaley Red Star

Về việc biến mất khi tôi hiểu nó, chúng tôi sẽ không chờ đợi quá lâu. Scoped Storage will be required in next year’s major platform release for all apps, independent of target SDK level. Lưu trữ trong phạm vi Android Q: Thực tiễn và cập nhật tốt nhất
Merov
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.