как скопировать базу данных с SD-карты в // базу данных - PullRequest
0 голосов
/ 15 ноября 2011

Извините за довольно зеленый вопрос, но я пока не смог найти решение.

Я пытаюсь восстановить базу данных из резервной копии на SD-карте.Следующий код (слегка измененная версия кода, предоставленного здесь в SO)

try {
    File sd = Environment.getExternalStorageDirectory();
    File data = Environment.getDataDirectory();

    if (sd.canWrite()) {
        String currentDBPath =
            "\\data\\com.dg\\databases\\" + com.dg.Constants.db_Table;
        String backupDBPath = "com.dg";
        File currentDB = new File(data, currentDBPath);
        File backupDB = new File(sd, backupDBPath);

        if (currentDB.exists()) {
            FileChannel dst = new FileInputStream(currentDB).getChannel();
            FileChannel src = new FileOutputStream(backupDB).getChannel();
            dst.transferFrom(src, 0, src.size());
            src.close();
            dst.close();
        }
        line4.setText("Successful Import");
    }
} catch (Exception e) {
    line4.setText(e.toString());
} 

Выдает исключение NonWriteableChannelException, даже если файл базы данных не открыт.

Ответы [ 2 ]

0 голосов
/ 15 ноября 2011

У вашего пользователя / приложения есть права доступа к // базе данных? (Если нет, то ЭТО ОТВЕТ .)

Возможно, это может сказать вам, почему в разрешении отказано:

IOException: отказано в разрешении

Bill Mote (из приведенной выше ссылки) также указал следующую настройку разрешения:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
0 голосов
/ 15 ноября 2011

Ваши данные ОБЩИЕ в

/ данные / данные / com.dg / баз данных

Вам нужно избавиться от двойного \ в пути.

Кроме того, вы используете Environment.getDataDirectory () в качестве родительского каталога, а затем «\ data \ com.dg \ database \» (и т. Д.) В качестве имени файла. Это совершенно неправильно.

Самый простой способ - использовать getDatabasePath в Context (или Activity). Дайте ему имя вашей БД, и он должен дать вам ссылку на файл. Тем не менее, я не знаю, что он будет делать, если этот файл еще не существует.

http://developer.android.com/reference/android/content/Context.html#getDatabasePath(java.lang.String)

Вы также можете попробовать простой метод getDir («базы данных», MODE_PRIVATE). Надеюсь, это вернет каталог базы данных.

Последняя попытка для каталога базы данных, очень грязная:

File dbDir = new File(getFilesDir().getParentFile(), "databases");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...