Удаление файлов через ContentResolver в отличие от их удаления через 'file.delete()'

Я только что написал функцию в приложении Android, которая удаляет файл, используя стандартный класс "Файл" в Java. то есть:

String fileName= "/mnt/Gallery/Img001.jpg";
File file = new File(fileName);
file.delete();

В то время как вышеприведенная процедура достаточно проста, мне было интересно, есть ли какое-либо преимущество в том, чтобы делать то же самое через ContentResolver. Любые советы будут оценены.

Приветствия,

Jarryd

------------------------------------------ РЕДАКТИРОВАТЬ ---- ------------------------------------

Здесь приведен пример удаления файла через Content Resolver. В этом примере предполагается, что удаляемый файл является изображением и что его идентификатор известен.

long mediaId = 155; // NOTE: You would normally obtain this from the content provider!
Uri contentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
Uri itemUri = ContentUris.withAppendedId(contentUri, mediaId);

int rows = getContentResolver().delete(itemUri, null, null);

String path = itemUri.getEncodedPath();
if(rows == 0)
{
    Log.e("Example Code:","Could not delete "+path+" :(");
}
else
{
    Log.d("Example Code:","Deleted "+path+ " ^_^");
}

Ответ 1

Структура поставщика контента Android имеет некоторые дополнительные преимущества по сравнению с непосредственным управлением данными.

Вы можете думать о строках "Где находится файл и кто может его удалить".

Сценарий 1

Файл находится на SD-карте (путь, доступный вашему приложению), и приложение удаляет его.

Решение:. Поскольку путь доступен для вас, java-подход будет работать с файлом Uri, как:

Файл://mnt/sdcard/downloads/image.jpeg

Сценарий 2

Файл находится в другом приложении (скажем, dropbox), и ваше приложение должно удалить файл.

Решение. Это означает, что файл фактически находится в частном хранилище другого приложения. Файл: Uri, указанный выше подход даст вам доступ запрещен. Таким образом, вашему приложению потребуется извлечь контент Uri из приложения, содержащего файл, и вызвать его поставщика контента для удаления.

fileUri = Uri.parse( "content://" + packageContainingTheFile "+ fileId);//заменим это на Uri, полученный из приложения. getContext(). getContentResolver(). delete (fileUri, null, null);

Сценарий 3

Файл находится в каталоге вашего приложения, т.е. в разделе data/data/com.yourpackage/yourfolder/yourfile.xxx, и ваше приложение удаляет его только.

Решение.. Здесь любой из указанных подходов будет работать, так как у вас есть доступ к удалению файла. Ури будет выглядеть так:

Файл://data/data/yourpackage/folder/file.ext

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

getContext(). getContentResolver(). notify (uri, null)

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

Сценарий 4

Файл находится в каталоге вашего приложения, то есть в разделе data/data/com.yourpackage/yourfolder/yourfile.xxx, и вы хотите открыть функциональность удаления для других приложений.

Решение. Это похоже на Сценарий 1, просто наоборот. Другие приложения не могут удалить файл в вашем частном хранилище с помощью Uri, как

file://data/data/yourpackage/folder/file.ext//работает только для вашего приложения

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

Содержание://providerAuthority/удалить/идентификатор которые ваш контент-провайдер должен будет сопоставить с абсолютным путем file.ext.

Резюме

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