При кэшировании изображений и данных следует использовать внутреннее или внешнее хранилище?

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

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

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

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

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

это рекомендуемый подход?

на устройствах старше с низким внутренним хранилищем, но с большим количеством места в SDcard это хороший подход?

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

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

3 ответов


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

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

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

обновлено из комментария:

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

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

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

обновлено из комментария

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

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


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


Я бы сохранил изображения на внешнем хранилище, возможно, в "скрытой" папке (добавив точку в начале имени папки:.папка), а также медиа-сканер "avoider" (.nomedia по -), потому что, как вы указали, вы хотите, чтобы приложение работало на старых устройствах, и именно эти устройства не имеют большой внутренней памяти.

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