2017-01-17 3 views
1

Я пытаюсь восстановить bike_info.db моего приложения файл БД имеет несколько записей, и я хочу, чтобы восстановить их в приложениикак восстановить резервную копию базы данных из SQLite в Andorid для не коренятся устройства

I пробовал с кодом ниже, тост успешно отображается, но db не восстанавливается, я не знаю, почему. может ли кто-нибудь помочь?

rest = (Button) findViewById(R.id.cview_restore); 

    rest.setOnClickListener(new OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      try { 
       File sd = Environment.getExternalStorageDirectory(); 
       File data = Environment.getDataDirectory(); 
       if (sd.canWrite()) { 

        String currentDBPath = "//data//" + "com.infyco.kp.new_tab" 
          + "//databases//" + "bike_info.db"; 
        String backupDBPath = "//data//bike_info.db"; // From SD directory. 
        File backupDB = new File(data, currentDBPath); 
        File currentDB = new File(sd, backupDBPath); 

        FileChannel src = new FileInputStream(backupDB).getChannel(); 
        FileChannel dst = new FileOutputStream(currentDB).getChannel(); 
        dst.transferFrom(src, 0, src.size()); 
        src.close(); 
        dst.close(); 
        Toast.makeText(getApplicationContext(), "Import Successful!", 
          Toast.LENGTH_SHORT).show(); 

       } 
      } catch (Exception e) { 

       Toast.makeText(getApplicationContext(), "Import Failed!", Toast.LENGTH_SHORT) 
         .show(); 

      } 
     } 
     }); 

после нажатия на кнопку отдыха это выход из андроида монитора:

01-17 14:00:40.922 8909-8909/com.infyco.kp.new_tab D/ViewRootImpl: ViewPostImeInputStage processPointer 0 
01-17 14:00:40.962 8909-8909/com.infyco.kp.new_tab D/ViewRootImpl: ViewPostImeInputStage processPointer 1 

01-17 14:00:41.012 8909-8909/com.infyco.kp.new_tab D/ViewRootImpl: #1 mView = android.widget.LinearLayout{9ba3ae9 V.E...... ......I. 0,0-0,0 #102039d android:id/toast_layout_root} 

01-17 14:00:41.072 8909-8909/com.infyco.kp.new_tab D/ViewRootImpl: MSG_RESIZED_REPORT: ci=Rect(0, 0 - 0, 0) vi=Rect(0, 0 - 0, 0) or=1 

01-17 14:00:43.022 8909-8909/com.infyco.kp.new_tab D/ViewRootImpl: #3 mView = null 

ответ

1

Вот ядро ​​восстановления кода с рабочего восстановления. Несколько отличий: Я заподлицо перед закрытием.

Я переименовал исходную БД (сделаю копию и удалю оригинал), таким образом, она не существует (легко вернуть ее обратно, если восстановление не удалось).

Я также делаю это в своей собственной ветке (не показано здесь).

Я получаю путь/имя файла базы данных из системы.

   dbfile = new File(currentdbfilename);  
       .......    
       try { 
        // Stage 1 Create a copy of the database 
        Log.i(logtag, "Stage 1 (make Copy of current DB)Starting"); 
        FileInputStream fis = new FileInputStream(dbfile); 
        OutputStream backup = new FileOutputStream(copydbfilename); 
        while ((copylength = fis.read(buffer)) > 0) { 
         backup.write(buffer, 0, copylength); 
        } 
        backup.flush(); 
        backup.close(); 
        fis.close(); 
        Log.i(logtag, "Stage 1 - Complete. Copy made of current DB."); 
        copytaken = true; 

        // Stage 2 - Delete the database file 
        if (dbfile.delete()) { 
         Log.i(logtag, "Stage 2 - Completed. Original DB deleted."); 
         origdeleted = true; 
        } 

        // Stage 3 copy from the backup to the deleted database file i.e. create it 
        Log.i(logtag, "Stage 3 - (Create new DB from backup) Starting."); 
        FileInputStream bkp = new FileInputStream(backupfilename); 
        OutputStream restore = new FileOutputStream(currentdbfilename); 
        copylength = 0; 
        while ((copylength = bkp.read(buffer)) > 0) { 
         restore.write(buffer, 0, copylength); 
        } 
        Log.i(logtag, "Stage 3 - Data Written"); 
        restore.flush(); 
        restore.close(); 
        Log.i(logtag, "Stage 3 - New DB file flushed and closed"); 
        restoredone = true; 
        bkp.close(); 
        Log.i(logtag, "Stage 3 - Complete."); 
       } catch (IOException e) { 
        e.printStackTrace(); 
        if(!copytaken) { 
         errlist.add("Restore failed copying current database. Error was " + e.getMessage()); 
        } else { 
         if(!origdeleted) { 
          errlist.add("Restore failed to delete current database. Error was " + e.getMessage()); 
         } 
         else { 
          if(!restoredone) { 
           errlist.add("Restore failed to recreate the database from the backup. Error was "+ e.getMessage()); 
           errlist.add("Restore will attempt to revert to the original database."); 
          } 
         } 
        } 
       } 

currentdbfilename устанавливается с помощью: -

  currentdbfilename = this.getDatabasePath(
       DBConstants.DATABASE_NAME) 
       .getPath(); 

copydbfilename выбирается из списка доступных резервных копий с помощью блесны (небольшая разница в том, что резервное копирование в внешней общественности хранения) ,

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

  • Нет связанных вопросов^_^