Удаляются ли файлы внутреннего хранилища при обновлении приложения?

Известно, что:

Когда пользователь удаляет ваше приложение, система удаляет все файлы вашего приложения из внутреннего хранилища.

То же самое происходит, когда пользователь обновляет приложение?


Почему я спрашиваю? У меня есть файл в папке raw/, который я перемещаю во внутреннее хранилище каждый раз при запуске моего приложения (если он еще не был перемещен):

//On Application onCreate() method:
InputStream jsonFile = ctx.getResources().openRawResource(R.raw.data);
File file = ctx.getFileStreamPath(Helper.FILE_NAME);
if(file.exists())
    return; //Exit because the file is already been copied.
FileOutputStream fos = ctx.openFileOutput(Helper.FILE_NAME, Context.MODE_PRIVATE);
copyFile(fos, jsonFile); //my method to copy files.

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

if(file.exists() && fileVersion == lastVersion) 

person iTurki    schedule 26.08.2015    source источник
comment
На всякий случай у меня останутся лишние чеки. Никогда нельзя быть слишком уверенным с этой чертовой системой ввода-вывода! :-)   -  person Sipty    schedule 26.08.2015
comment
@Sipty Тем не менее, ненужное чтение ввода-вывода при каждом запуске приложения тоже кажется расточительным!   -  person iTurki    schedule 26.08.2015
comment
Он будет просто вызываться onCreate () / onResume () - ничего лишнего в том, чтобы убедиться, что приложение не выйдет из строя!   -  person Sipty    schedule 26.08.2015
comment
Вы не потеряете внутренние файлы при обновлении. Однако в любом случае у вас всегда должны быть чеки; что, если пользователь решит удалить кеш вручную?   -  person Knossos    schedule 26.08.2015
comment
@Knossos, то файла там не будет, и он будет скопирован из raw. Но размещение версии приложения / файла в общих настройках или (лучше) в базе данных не очень дорого.   -  person 323go    schedule 26.08.2015
comment
но версию файла Prefs нужно будет сравнить с текущей версией файла, отсюда и дополнительное чтение ввода-вывода.   -  person iTurki    schedule 26.08.2015
comment
возможный дубликат внутреннего хранилища Android при обновлении приложения   -  person Sipty    schedule 26.08.2015


Ответы (3)


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

Вам нужно будет добавить дополнительную проверку.

Для справки, следующая документация объясняет это окольным путем:

Параметры хранения

Обратите внимание, что первый абзац:

Android предоставляет несколько вариантов сохранения постоянных данных приложения.

(курсив добавлен)

Далее в разделе Внутреннее хранилище говорится

Когда пользователь удаляет ваше приложение, эти файлы удаляются.

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

Я никогда не видел, чтобы внутренний файл удалялся во время обновления, так что на практике это также верно.

Как бы то ни было, если файл в raw доступен только для чтения, вам даже не нужно его копировать. openRawResource() даст вам InputStream и позволит вам получить к нему доступ, как к любому другому файлу. Внутри это просто файл.

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

person 323go    schedule 26.08.2015
comment
В подтверждение его вывода вам следует взглянуть на беседу в этом ответе (тот, который я привел выше): stackoverflow.com / a / 10354757/2796939 - person Sipty; 26.08.2015
comment
@Sipty, честно говоря, я не понимаю, как этот ответ что-то добавляет. - person 323go; 26.08.2015
comment
Я всегда предполагал, что когда система обновит приложение, оно удалит + установит приложение, а удаление означает удаление данных приложения. Вот почему меня это сбивало с толку. - person iTurki; 26.08.2015
comment
@iturki, это понятно. Одно из моих приложений хранит очень большой пул внутренних данных (2-3 ГБ), которые всегда должны быть доступны пользователю. Кроме того, это конфиденциальные данные, которые не могут быть открыты. Если бы это было удалено при каждом обновлении, это было бы болезненным для пользователя и, возможно, привело бы к невероятным расходам на передачу данных. Это приложение использовалось с Android 2.2 и с тех пор претерпело бесчисленное количество обновлений, при этом внутренние файлы никогда не были скомпрометированы. - person 323go; 26.08.2015
comment
@ 323go почему-то пользователи моего приложения продолжают жаловаться на потерю данных после обновления, хотя я не мог определить основную причину. Может быть, пользователи удаляют и устанавливают, так как это часто происходит, я перехожу к параметрам внешнего хранилища - person Dileep; 28.02.2016

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

По-прежнему от базы данных, это зависит от способа, которым разработчик построил приложение, если есть изменение версии базы данных, может произойти замена или полное удаление базы данных.

person Muyide Ibukun    schedule 26.08.2015
comment
Речь идет об обновлении, а не об удалении приложения. - person iTurki; 26.08.2015
comment
подумал, что я должен дать объяснение и по поводу удаления, так как есть аналогичный процесс. - person Muyide Ibukun; 26.08.2015

При использовании external storage, то есть /sdcard/, ваши данные не будут удалены, даже если приложение будет удалено.

Что касается internal storage: вопрос задавался раньше: Внутреннее хранилище Android при обновлении приложения

И напоследок, я бы не оставил ничего на волю случая - обязательно проверяйте!

person Sipty    schedule 26.08.2015
comment
Было бы полезно объяснить, почему за мой совершенно правильный ответ не проголосовали. - person Sipty; 26.08.2015
comment
Может быть, кто-то счастлив против ... мой (правильный ответ) тоже получил отрицательный голос. Я мог видеть это на вашем, потому что на самом деле он не отвечает на вопрос. Вопрос касался внутреннего хранилища, а не внешнего хранилища, к которому вы обратились правильно. Таким образом, это не ответ, и я мог понять, почему он был отклонен. - person 323go; 26.08.2015
comment
Да, я только что перечитал вопрос и сейчас обновляю его. :) - person Sipty; 26.08.2015
comment
@Sipty Спасибо, что поделились ссылкой. Что касается внешнего хранилища, к сожалению, это не вариант. - person iTurki; 26.08.2015
comment
Если вы нашли повторяющийся вопрос, вы должны отметить этот вопрос как таковой и сохранить Stackoverflow чистым (и без шума). - person 323go; 26.08.2015
comment
Я не вижу ничего шумного в том, чтобы дать развернутый ответ с указанием альтернатив. - person Sipty; 26.08.2015