2014-12-17 6 views
1

Я использую приведенный ниже код для загрузки уже загруженного файла db sqlite с диска Google в папку data/data/packagename/databases, но когда метод завершается, я вижу предупреждающее сообщение о повреждении db, зарегистрированное в logcat, а также все данные на устройстве для приложения перезаписываются и отображаются пустым при открытии приложения.Google Диск Android api - Загрузка файла db с диска

mfile = Drive.DriveApi.getFile(mGoogleApiClient, mResultsAdapter.getItem(0).getDriveId()); 
        mfile.openContents(mGoogleApiClient, DriveFile.MODE_READ_ONLY, null).setResultCallback(contentsOpenedCallback); 

--mfile is an instance of DriveFile 

final private ResultCallback<ContentsResult> contentsOpenedCallback = new ResultCallback<ContentsResult>() 
{ 
    @Override 
    public void onResult(ContentsResult result) 
    { 
     if (!result.getStatus().isSuccess()) 
     { 
      FileUtils.appendLog(getApplicationContext(), Tag + "-onResult", "Error opening file"); 
      return; 
     } 

     try 
     { 
      if (GetFileFromDrive(result)) 
      { 
         //FileUtils.Restore(getApplicationContext()); 
         SharedPrefHelper.EditSharedPreference(getApplicationContext(), Constants.PREFS_DO_RESTORE, false); 
      } 

     } 
     catch (FileNotFoundException e) 
     { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     catch (IOException e) 
     { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 
}; 

private boolean GetFileFromDrive(ContentsResult result) 
{ 
    Contents contents = result.getContents(); 
    //InputStreamReader rda = new InputStreamReader(contents.getInputStream()); 
    BufferedReader reader = new BufferedReader(new InputStreamReader(contents.getInputStream())); 
    FileOutputStream outStream; 
    String currLine; 
    boolean restoreSuccess = false; 

    File sourceDbFile = BackupDBBeforeDeletion(); 

    if(sourceDbFile != null) 
     sourceDbFile.delete(); 

    try 
    { 
     outStream = new FileOutputStream(getApplicationContext().getDatabasePath(Constants.DB_NAME)); 
     while ((currLine = reader.readLine()) != null) 
     { 
      outStream.write(currLine.getBytes()); 
     } 

     outStream.flush(); 

     reader.close(); 
     outStream.close(); 
     restoreSuccess = true; 
    } 
    catch (FileNotFoundException e) 
    { 
     // TODO: Log exception 
    } 
    catch (IOException e) 
    { 
     // TODO: Log Exception 
    } 

    return restoreSuccess; 
} 

Когда метод GetFileFromDrive завершается, БД коррупция проявляется на LogCat и все имеющиеся данные о приложении datanase файла (БД SQLite) ушли.

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

+0

Попробуйте записать файл в локальный файл первый (не путь DB-файл) и убедитесь, что не поврежден. Затем скопируйте файл на место. Возможно, SQLite развращает его - он пытается быть прочитанным/записанным во время написания файла. Просто мысль. – Randy

+1

Да, это часть моей проблемы, так как когда я пытался делать именно то, что вы предложили, файл db, сформированный на этом другом пути, но ** db был пустым **, хотя я знаю, что там есть данные версия привода. –

ответ

0

я смог, наконец, исправить свой собственный вопрос, заменив file.openContents с File.open и установкой результата обратного вызова с DriveContents результата назад, а не ContentsResult.

Также используется DriveContents для установки InputStream на то же (первоначально открытое в Mode_Read_Only в открытом методе), а затем запись его в физический файл «.db» в местоположении пути базы данных.

Теперь база данных не повреждена и не восстанавливает данные.

+0

Вы уверены, что на самом деле это исправлено и не просто работает один раз? Я думаю, что я вижу много этого. Файлы кажутся точными локально - один и тот же клиент может читать файлы обратно. Однако они, похоже, повреждены на диске и на других клиентах. Вот почему я уверен, что это не проблема с моим приложением ...: -/ –

+0

Да, я загрузил файл .db, загруженный на Google Drive, а затем открыл его в обозревателе Sqlite для проверки данных. И сам файл, и данные внутри были неповрежденными в версии для диска при загрузке из приложения. То же самое при восстановлении обратно в приложение перезаписал локальный SQL-адрес db и правильно восстановил данные. Я запускаю этот код много раз сейчас, и чтение-запись на диск отлично работает. –

+0

Вы тестировали это на разных устройствах? Для меня локальные данные всегда прекрасны, но данные в веб-интерфейсе Google Drive (и других клиентах) повреждаются (в моем случае это JSON, поэтому это довольно очевидно). –

1

Это решение не работает для меня. Файлы sqlite, которые я получил с диска Google, более длинны, чем я сохранил на диске Google. Вероятно, это происходит потому, что вы используете класс Buffereader и метод readline, который считывает данные в char. В моем проекте и опыте эти решения не работают, я получил поврежденный sqlite db. Итак ... Я сохраняю sqlite db на диске Google в байте, так что ** Я читал с диска Google тот же sqlite db в байте, используя BufferedInputStream. Это отлично работает для меня:

DriveContents contents = result.getDriveContents(); 
       BufferedInputStream bis = new BufferedInputStream(contents.getInputStream()); 
       byte[] buffer = new byte[1024]; 
       int bytesread = 0; 
       FileOutputStream outStream; 

       /*if(currentDB != null) 
        currentDB.delete();*/ 

       try 
       { 
        outStream = new FileOutputStream(currentDB); 
        while((bytesread = bis.read(buffer)) != -1) 
        { 
         outStream.write(buffer,0,bytesread); 
        } 

        outStream.flush(); 
        bis.close(); 
        outStream.close(); 
       } 
       catch (FileNotFoundException e) 
       { 
        Log.i(TAG,e.getMessage()); 
       } 
       catch (IOException e) 
       { 
        Log.i(TAG,e.getMessage()); 
       } 
       finally { 
        Toast.makeText(getActivity().getBaseContext(),"Data from Google Drive restored successfully." , Toast.LENGTH_LONG).show(); 
       } 
       contents.discard(mGoogleApiClient); 
+0

вы только что спасли мою жизнь .... thanx много –

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