2017-04-06 2 views
1

AppFolderSQLite 파일을 백업하기 위해 Google drive API을 사용하고 있습니다. 잘 작동합니다. 문제는 모든 백업에서 메모리 크기가 증가했기 때문입니다. 초기 백업 파일 크기는 1KB 이었지만 백업 버튼을 클릭 할 때마다 내 앱 파일의 파일 크기는 AppFolder 증가했습니다. AppFolder에 파일이 있는지 확인하는 방법은 무엇입니까? 존재하면 내 응용 프로그램 AppFolder 파일의 메모리를 지우는 방법을 누른 다음 AppFolder에 내 파일 만 백업하십시오. 제발 좀 해결책을 줘. 나는이 문제를 해결하기 위해 2 일 동안 고생했다. 하지만 난 할 수 없어 ..Google 드라이브 API의 숨겨진 앱 데이터 파일 크기를 지우려면 어떻게해야하나요?

업로드하기 전에 파일을 검색하고 삭제하기 위해 검색 쿼리를 추가 할 위치는 어디입니까? 코드를 추가했습니다. 추가 코드 : Bakup 버튼 리스너 :

backupButton.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       Drive.DriveApi.newDriveContents(mGoogleApiClient) 
         .setResultCallback(driveContentsCallback); 
      } 
     }); 

그런 다음 콜백에서,

final private ResultCallback<DriveApi.DriveContentsResult> driveContentsCallback = new 
      ResultCallback<DriveApi.DriveContentsResult>() { 
       @Override 
       public void onResult(DriveApi.DriveContentsResult result) { 
        if (!result.getStatus().isSuccess()) { 
         return; 
        } 

        final DriveContents driveContents = result.getDriveContents(); 
        new Thread() { 
         @Override 
         public void run() { 
          OutputStream outputStream = driveContents.getOutputStream(); 
          FileInputStream inputStream = null; 
          File file = changeSQLiteToJSON(); 
          try { 
           try { 
            inputStream = new FileInputStream(file); 
           } catch (FileNotFoundException e) { 
            e.printStackTrace(); 
           } 
           byte[] buf = new byte[1024]; 
           int bytesRead; 
           try { 
            if (inputStream != null) { 
             while ((bytesRead = inputStream.read(buf)) > 0) { 
              outputStream.write(buf, 0, bytesRead); 
             } 
            } 
           } catch (IOException e) { 
            e.printStackTrace(); 
           } 
          } catch (NullPointerException ex) { 
           ex.printStackTrace(); 
          } finally { 
           file.delete(); 
          } 

          MetadataChangeSet changeSet = new MetadataChangeSet.Builder() 
            .setTitle(JSON_NAME) 
            .setMimeType("text/plain") 
            .setStarred(true).build(); 

          Drive.DriveApi.getAppFolder(mGoogleApiClient) 
            .createFile(mGoogleApiClient, changeSet, driveContents) 
            .setResultCallback(fileCallback); 
         } 
        }.start(); 
       } 

      }; 

FinalCallBack : 나를 위해

final private ResultCallback<DriveFolder.DriveFileResult> fileCallback = new 
      ResultCallback<DriveFolder.DriveFileResult>() { 
       @Override 
       public void onResult(DriveFolder.DriveFileResult result) { 
        if (!result.getStatus().isSuccess()) { 
         return; 
        } 
        Toast.makeText(getApplicationContext(), "Created a file with content: " + result.getDriveFile().getDriveId(), Toast.LENGTH_SHORT).show(); 
       } 
      }; 
+0

가 먼저 업로드 한 후 이전을 삭제 파일 검색 시도 되세요 새로운 것? https://developers.google.com/drive/android/queries – DaImTo

+0

@DaImTo 파일 검색을 위해 검색어를 추가 할 위치를 안내해 주시겠습니까? 코드를 추가했습니다. –

+0

나는 안드로이드 개발자가 아니기 때문에 물어볼 가장 좋은 사람은 아닐 것이다. 개인적으로 파일 검사를 업로드 한 후 이전 파일을 삭제하는 것이 더 많습니다. 드라이브가 다른 파일과 동일한 이름의 파일을 취급 함을 기억하십시오. – DaImTo

답변

1

이 코드가 작동 ::

거짓 설정

boolean isUploading = false; 
private static final String JSON_NAME = "yourfilename.txt"; 

BackupButton 리스너 쿼리에 대한

backupButton.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       if (isUploading) 
        return; 
       try { 
        isUploading = true; 
        Drive.DriveApi.requestSync(mGoogleApiClient) 
          .setResultCallback(fileCheckCallBack); 
       } catch (IllegalStateException ex) { 

       } 
      } 
     }); 

fileCheckCallBack appfolder

private ResultCallback<Status> fileCheckCallBack = new ResultCallback<Status>() { 
     @Override 
     public void onResult(@NonNull Status status) { 
      if (!status.isSuccess()) { 
      } 
      Query query = new Query.Builder() 
        .addFilter(Filters.contains(SearchableField.TITLE, JSON_NAME)) 
        .build(); 
      Drive.DriveApi.query(mGoogleApiClient, query) 
        .setResultCallback(deleteMetaDataCallback); 
     } 
    }; 

deleteMetaDataCallback에서 메타 데이터 제목 (가 새 파일을 만들고 다른 응용 프로그램 폴더에 존재하는 경우 파일을 삭제)

final private ResultCallback<DriveApi.MetadataBufferResult> deleteMetaDataCallback = 
      new ResultCallback<DriveApi.MetadataBufferResult>() { 
       @Override 
       public void onResult(DriveApi.MetadataBufferResult result) { 
        if (!result.getStatus().isSuccess()) { 
         Toast.makeText(getBaseContext(), "Problem while retrieving results", Toast.LENGTH_LONG).show(); 
         isUploading = false; 
         return; 
        } 

        MetadataBuffer mdb = null; 
        mdb = result.getMetadataBuffer(); 
        for (Metadata md : mdb) { 
         DriveId driveId = md.getDriveId(); 
         String name = md.getTitle(); 
         if (name.equals(JSON_NAME)) { 
          driveId.asDriveResource().delete(mGoogleApiClient).setResultCallback(deleteSuccessCallBack); 
          return; 
         } 
        } 

        if (mdb != null) mdb.close(); 
        Drive.DriveApi.newDriveContents(mGoogleApiClient) 
          .setResultCallback(driveContentsCallback); 

       } 
      }; 
성공 후전체 응용 프로그램 폴더에서 삭제 : deletesuccessCallBack를

final ResultCallback<Status> deleteSuccessCallBack = 
      new ResultCallback<Status>() { 
       @Override 
       public void onResult(@NonNull Status status) { 
        if (!status.isSuccess()) { 
         isUploading = false; 
         return; 
        } 
        Drive.DriveApi.newDriveContents(mGoogleApiClient) 
          .setResultCallback(driveContentsCallback); 
       } 

      }; 

그런 다음, 그 driveContentsCallback에

final private ResultCallback<DriveApi.DriveContentsResult> driveContentsCallback = new 
      ResultCallback<DriveApi.DriveContentsResult>() { 
       @Override 
       public void onResult(DriveApi.DriveContentsResult result) { 
        if (!result.getStatus().isSuccess()) { 
         isUploading = false; 
         return; 
        } 

        final DriveContents driveContents = result.getDriveContents(); 
        new Thread() { 
         @Override 
         public void run() { 
          OutputStream outputStream = driveContents.getOutputStream(); 
          FileInputStream inputStream = null; 
          File file = changeSQLiteToJSON(); 
          try { 
           try { 
            inputStream = new FileInputStream(file); 
           } catch (FileNotFoundException e) { 
            e.printStackTrace(); 
           } 
           byte[] buf = new byte[1024]; 
           int bytesRead; 
           try { 
            if (inputStream != null) { 
             while ((bytesRead = inputStream.read(buf)) > 0) { 
              outputStream.write(buf, 0, bytesRead); 
             } 
            } 
           } catch (IOException e) { 
            e.printStackTrace(); 
           } 
          } catch (NullPointerException ex) { 
           ex.printStackTrace(); 
          } finally { 
           file.delete(); 
          } 
          MetadataChangeSet changeSet = new MetadataChangeSet.Builder() 
            .setTitle(JSON_NAME) 
            .setMimeType("text/plain") 
            .setStarred(true).build(); 

          Drive.DriveApi.getAppFolder(mGoogleApiClient) 
            .createFile(mGoogleApiClient, changeSet, driveContents) 
            .setResultCallback(fileCallback); 
         } 
        }.start(); 
       } 

      }; 

fileCallBack에게

final private ResultCallback<DriveFolder.DriveFileResult> fileCallback = new 
      ResultCallback<DriveFolder.DriveFileResult>() { 
       @Override 
       public void onResult(DriveFolder.DriveFileResult result) { 
        isUploading = false; 
        if (!result.getStatus().isSuccess()) { 
         return; 
        } 
        Toast.makeText(getApplicationContext(), "Created a file with content: " + result.getDriveFile().getDriveId(), Toast.LENGTH_SHORT).show(); 
       } 
      }; 
관련 문제