При кэшировании изображений и данных следует использовать внутреннее или внешнее хранилище? - PullRequest
9 голосов
/ 16 декабря 2011

Я прочитал это Настройки сохранения Android-данных / данные во Внутреннем / Внешнем хранилище , но я не думаю, что действительно получил ответ.

Я разрабатываюприложение, в котором я должен хранить некоторые данные "кеша" , например, дюжину изображений и некоторые строки (json).

Изначально я хранил все это на SD-карте (внешнийхранилище) но позже я подумал, что это может быть устаревшим из-за устаревания SDCard в большинстве последних устройств.

Прочитав немного, я понял, что внешнее хранилище - это не только SDCard, но и "съемный носитель".(например, SD-карта) или внутреннее (несъемное) хранилище ", поэтому его не следует считать устаревшим, но ... оно является общим пространством, и не существует прав собственности на файлы, хранящиеся там, поэтому первая проблема заключалась в том, что Я не смог удалить их, когда приложение было удалено.

Поэтому я изменил на Внутреннее хранилище , чтобы избежать "общего доступа" к файлам / изображениям, а также их наличияудалено после удаления приложениявкл.

Является ли это рекомендуемым подходом?

На устройствах старше с небольшим объемом внутренней памяти, но с большим количеством места на SD-карте это хороший подход?

Мое приложение поддерживает от 1.6 до 4.0 (пока), поэтому у меня есть много устаревших устройств ... и я должен иметь приложение, работающее (хорошо) на всех.

Ждем некоторых интересныхответы!

Ответы [ 3 ]

4 голосов
/ 16 декабря 2011

Это зависит от типа данных, которые вы хотите сохранить.

Вы упоминаете, что это кэшированные данные, поэтому я предполагаю, что не должно иметь значения, если по какой-то причине все это исчезнет. Это заставляет меня поверить, что вы должны использовать getCacheDir(). В этом случае система удалит файлы, если кэш станет слишком большим, поэтому устройства с низким внутренним хранилищем не должны вызывать проблем (хотя в любом случае рекомендуется управлять этим самим), это относительно безопасно и будет управляться приложением так что если будет деинсталляция, она будет удалена.

getExternalCacheDir() был введен в 2.2, поэтому он бесполезен для вас, если вы не хотите определять версию и переключаться между двумя каталогами кэширования getExternalCacheDir() не обеспечивает безопасность, поэтому в любом случае к данным может получить доступ на SD-карту. Единственная причина, по которой я мог бы подумать, что вы, возможно, захотите это сделать, заключается в желаемом размере кэша, но из вашего описания данные не кажутся чрезмерными.

ОБНОВЛЕНО из комментария:

хотя это особый случай, когда это кеш ... но я не хочу это должно быть удалено всякий раз, когда система хочет. Это вид кеша что мне нужно, чтобы приложение решило, когда нужно чистить. Что является главной заботой хранения на «обычном» внутреннем хранилище, не находясь в кеше реж

Если вы попадаете на этап, на котором система очищает внутренние кэшированные данные из-за того, что хранилище слишком мало, вам, вероятно, следует оставить его для очистки такого рода данных приложения. Используя стандартное внутреннее хранилище данных, вы обходите эту безопасную защиту, которая, вероятно, создаст больше неприятных проблем, чем удаление данных приложения.

Если ваши данные имеют большое значение, я бы предложил попытаться определить конкретные данные, которые являются более важными, и управлять ими отдельно. Если эти данные, которые вы идентифицируете, должны быть защищены, то внутреннее хранилище с использованием файлов или базы данных (в зависимости от типа данных) кажется вашим единственным реальным вариантом, но вам следует опасаться наращивания этих данных.

ОБНОВЛЕНО из комментария

Что вы думаете об использовании SharedPreferences для сохранения строковых данных? Есть ли ограничение на размер сохраняемой строки SharedPreference? Это (хорошо) возможность

В прошлом я использовал общие предпочтения для хранения относительно больших строк json без проблем, я считаю, что это проще, чем использовать базы данных для примитивных типов данных (и строк), где для сохранения ограниченные значения. Однако, когда у вас есть изображения или много значений, управление становится более сложным. Также у вас будет та же проблема, что и со стандартным внутренним хранилищем с точки зрения места для хранения.

0 голосов
/ 16 декабря 2011

Я бы держал изображения на внешнем хранилище, возможно, в «скрытой» папке (добавляя точку в начале названия папки: .folder ), а также в «сканере» Media Scanner .nomedia ), поскольку, как вы указали, вы хотите, чтобы приложение работало на старых устройствах, и именно этим устройствам не нужно много внутренней памяти.

Вы также можете добавить опцию в своем приложении, чтобы удалить эту папку, поэтому, если пользователь хочет удалить его, он может сделать это раньше.

0 голосов
/ 16 декабря 2011

Я бы использовал внутреннюю память для кеша.Это лишит пользователя возможности доступа к файлам, используемым в вашем приложении.Я бы пошел на внутренний

...