2017-02-19 5 views
-1

Как я могу экспортировать базу данных SQLite для внешнего хранения `я пытаюсь этот метод, но он показывает исключениеКак я могу экспортировать свою sqllite базу данных для SDCard

public void exportdb() { 


    Log.e("data ","export"); 
    File sd=Environment.getExternalStorageDirectory(); 
    File data = Environment.getDataDirectory(); 
    FileChannel source=null; 
    FileChannel destination=null; 
    String currentDBPath = "/data/"+ "com.example.kishababy.myapplication.DataBase" +"/databases/"+ "contactsManager"; 
    String backupDBPath = "contactsManager"; 
    File currentDB = new File(data, currentDBPath); 
    File backupDB = new File(sd, backupDBPath); 
    try { 
     source = new FileInputStream(currentDB).getChannel(); 
     destination = new FileOutputStream(backupDB).getChannel(); 
     destination.transferFrom(source, 0, source.size()); 
     source.close(); 
     destination.close(); 
     Log.e("Toast","befor"); 

     Toast.makeText(getApplicationContext(), "DB Exported!", Toast.LENGTH_LONG).show(); 
    } catch(IOException e) { 
     e.printStackTrace(); 
     Log.e("Exception",e.toString()); 
    } 






} 

Исключение при teasting enter image description here

ответ

0

Я думаю, вам необходимо получить или предоставить разрешение WRITE_EXTERNAL для вашего приложения (ваш телефон работает под управлением Android 7.0, так что это мое лучшее предположение)

+0

я добавил эти настройки уже разрешения –

0

Возможно, вам нужно указать путь как:

String currentDBPath = "//data//"+ "com.example.kishababy.myapplication.DataBase" +"//databases//"+ "contactsManager"; 

И Просто убедитесь, что вы добавили

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></u‌​ses-permission> 

проверить SDCard состояние первого:

String state = Environment.getExternalStorageState(); 
if (Environment.MEDIA_MOUNTED.equals(state)) { 
    Log.d("Test", "sdcard mounted and writable"); 
} 
else if (Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)) { 
    Log.d("Test", "sdcard mounted readonly"); 
} 
else { 
    Log.d("Test", "sdcard state: " + state); 
} 
+0

я добавил эти настройки уже разрешения –

+0

И вы изменить упомянутый путь? –

+0

Является ли этот метод ОК –

0

использование

String currentDBPath = "/data/data/"+ "com.example.kishababy.myapplication.DataBase" +"/databases/"+ "contactsManager"; 

вместо

String currentDBPath = "/data/"+ "com.example.kishababy.myapplication.DataBase" +"/databases/"+ "contactsManager"; 

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

Вы можете использовать следующую полную интеграцию:

  1. Добавить разрешение пользователя в ваш файл манифеста для хранения

    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> 
    
  2. Используйте этот фрагмент кода для резервного копирования:

    public void exportDb() { 
    try { 
        String inFileName = "/data/data/<com.abc.app>/databases/app.db"; 
    
        File dbFile = new File(inFileName); 
        FileInputStream fis = new FileInputStream(dbFile); 
    
        String outFileName = Environment.getExternalStorageDirectory() + "/app_copy.db"; 
    
        OutputStream output = new FileOutputStream(outFileName); 
    
        byte[] buffer = new byte[1024]; 
        int length; 
        while ((length = fis.read(buffer)) > 0) { 
         output.write(buffer, 0, length); 
        } 
    
        output.flush(); 
        output.close(); 
        fis.close(); 
    } catch (Exception e) { 
        e.printStackTrace(); 
    } 
    } 
    
  3. Проверьте разрешение на хранение и метод резервного копирования:

    private void backupData() { 
    if ((ContextCompat.checkSelfPermission(mActivity, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED)) { 
        ActivityCompat.requestPermissions(mActivity, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 11); 
    } else { 
        exportDb(); 
    } 
    

    }

    @Override 
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { 
    if (requestCode == 11) { 
        if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { 
         exportDb(); 
        } 
    } 
    } 
    
+0

Я не знаю, где проблема с такой же ошибкой –

+0

java .io.FileNotFoundException: /data/com.example.kishababy.myapplication.DataBase/databases/contactsManager (Нет такого файла или каталога) –

+0

Все еще вы используете «/data/com.example.kishababy.myapplication.DataBase/databases/contactsManager». Не могли бы вы попробовать с этим URL: «/data/data/com.example.kishababy.myapplication.DataBase/databases/contactsManager» – Ashiq

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