2015-11-22 2 views
1

Я заметил, что на SO нет окончательного ответа, поэтому я ищу канонический ответ на вопрос «Как проверить, существует ли папка и создать если это не так, используя API Android Диска Google? ". В идеале показаны примеры как асинхронного подхода с использованием ResultCallback, так и синхронного подхода с использованием .await().Проверьте, существует ли папка, и создайте ее, если нет

P.S. Я знаю this question with the same title, но принятый ответ фокусируется на известной ошибке задержки на isTrashed(), и неясно, в какой момент кода вы действительно знаете, что папка существует. Другие ответы кажутся устаревшими.

ответ

9

This question - сфокусированный на проблемах с отсутствием статуса лагги - предоставляет шаблон для тестирования, если существует папка.

Использование асинхронного обратного вызова:

Query query = new Query.Builder() 
    .addFilter(Filters.and(Filters.eq(
      SearchableField.TITLE, "MyFolder"), 
      Filters.eq(SearchableField.TRASHED, false))) 
    .build(); 
    Drive.DriveApi.query(getGoogleApiClient(), query) 
     .setResultCallback(new ResultCallback<DriveApi.MetadataBufferResult>() { 
    @Override 
    public void onResult(DriveApi.MetadataBufferResult result) { 
     if (!result.getStatus().isSuccess()) { 
      showMessage("Cannot create folder in the root."); 
     } else { 
      boolean isFound = false; 
      for(Metadata m : result.getMetadataBuffer()) { 
       if (m.getTitle().equals("MyFolder")) { 
        showMessage("Folder exists"); 
        isFound = true; 
        break; 
       } 
      } 
      if(!isFound) { 
       showMessage("Folder not found; creating it."); 
       MetadataChangeSet changeSet = new MetadataChangeSet.Builder() 
        .setTitle("MyFolder") 
        .build(); 
       Drive.DriveApi.getRootFolder(getGoogleApiClient()) 
         .createFolder(getGoogleApiClient(), changeSet) 
         .setResultCallback(new ResultCallback<DriveFolder.DriveFolderResult>() { 
        @Override 
        public void onResult(DriveFolder.DriveFolderResult result) { 
         if (!result.getStatus().isSuccess()) { 
          showMessage("Error while trying to create the folder"); 
         } else { 
          showMessage("Created a folder"); 
         } 
        } 
       }); 
      } 
     } 
    } 
}); 

Использование синхронных .await()

Query query = new Query.Builder() 
    .addFilter(Filters.and(Filters.eq(
      SearchableField.TITLE, "MyFolder"), 
      Filters.eq(SearchableField.TRASHED, false))) 
    .build(); 

    DriveApi.MetadataBufferResult result = Drive.DriveApi.query(getGoogleApiClient(), query) 
     .await(); 

    if (!result.getStatus().isSuccess()) { 
     showMessage("Cannot create folder in the root."); 
    } else { 
     boolean isFound = false; 
     for(Metadata m : result.getMetadataBuffer()) { 
      if (m.getTitle().equals("MyFolder")) { 
       showMessage("Folder exists"); 
       isFound = true; 
       break; 
      } 
     } 
     if(!isFound) { 
      showMessage("Folder not found; creating it."); 
      MetadataChangeSet changeSet = new MetadataChangeSet.Builder() 
        .setTitle("MyFolder") 
        .build(); 

      Drive.DriveApi.getRootFolder(getGoogleApiClient()) 
         .createFolder(googleApiClient, changeSet).await(); 

      if (!result.getStatus().isSuccess()) { 
       showMessage("Error while trying to create the folder"); 
      } else { 
       showMessage("Created a folder"); 
      } 
     } 
+0

Можете ли вы рассказать мне, как обновить файл внутри папки, если он уже завершен? – Atula

+0

@Atula Извините, я не делал никаких Android в течение 6 месяцев, и я действительно не помню, как это работает :( –

+0

его хорошо .. я обойдусь :-) – Atula

0

Ваша цитата:

... не ясно, о в какой момент в коде вы действительно знаю, существует папка

В REST Api, вы ожидаете ответа от 'ecexute()'. Прямо, и вы можете время отклика. Вы получаете идентификатор папки/файла (ResourceId), и вы знаете, что он существует на Диске.

В GDAA, посмотрите на this answer. Опять же, когда вы получаете уведомление о завершении с помощью действительного ResourceId, вы знаете, что папка/файл находится «вверх-туда».

Удачи

Смежные вопросы