2017-04-06 2 views
1

Ich verwende Google drive API, um die SQLite Datei auf meinem AppFolder zu sichern. Es funktioniert gut. Das Problem ist, dass bei jedem Backup die Speichergröße erhöht wurde. Die ursprüngliche Größe der Backup-Datei war 1KB, aber wenn ich auf Backup-Schaltfläche klick, wurde jedes Mal die Dateigröße von AppFolder meiner App-Datei erhöht. Wie überprüft man die Datei existiert oder nicht auf AppFolder? Wenn vorhanden dann, wie den Speicher meiner App AppFolder Datei zu löschen, dann sichern Sie nur meine Datei auf AppFolder. Bitte gab mir eine Lösung. Ich bin von 2 Tagen steckengeblieben, um dieses Problem zu lösen. Aber ich kann nicht ..Wie kann ich die Dateigröße versteckte App-Daten von Google Drive API löschen?

Wo die Suchabfrage hinzufügen, um die Datei zu suchen und diese Datei vor dem Hochladen zu löschen? Ich habe den Code hinzugefügt. Added-Code: bakup Knopf Zuhörer:

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

Dann in seinem Rückruf,

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

Haben Sie zuerst die Datei versucht der Suche die alte löschen nach dem Hochladen der Neue? https://developers.google.com/drive/android/queries – DaImTo

+0

@DaImTo Können Sie mir sagen, wo Sie eine Suchanfrage hinzufügen können, um die Datei zu durchsuchen? Ich habe den Code hinzugefügt. –

+0

Ich bin kein Android-Entwickler so wahrscheinlich nicht die beste Person zu fragen. Persönlich würde ich es tun, nachdem Sie Ihre Datei hochladen überprüfen, ob es mehr als eine ältere löschen. Remember Drive behandelt Dateien mit demselben Namen als verschiedene Dateien. – DaImTo

Antwort

1

für mich Dieser Code Arbeit ::

Falsch setzen

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

BackupButton Listener

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 für Abfrage der Metadaten Titel von 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 (Löschen Sie die Datei, wenn sie in App-Ordner vorhanden ist sonst neue Datei erstellen)

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); 

       } 
      }; 

Nach Erfolg voll von App-Ordner löschen: 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); 
       } 

      }; 

Dann in seiner 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(); 
       } 
      }; 
Verwandte Themen