Учитывая, что мое приложение все еще находится в разработке, время от времени появляется ошибка, которая влияет на мою базу данных, связанную с приложением. Поскольку я уже тестировал данные, я не хочу вводить каждый раз, когда что-то идет не так, я хочу реализовать простую функцию импорта/экспорта.простой вариант импорта/экспорта базы данных sqlite
Я недавно наткнулся на вопрос this, который более или менее то, что я хочу. Я покажу, что мой код реализован. Функция экспорта работает нормально, я могу протестировать ее с помощью приложения SQLIte Database
с рынка Android. Проблема заключается в импорте. Это показывает мне Toast
, что все прошло хорошо, но ничего не происходит. Тем не менее, я не совсем уверен, что я делаю это правильно.
В MainMenuActivity
я реализованы следующие методы:
(...)
public boolean onCreateOptionsMenu(Menu menu){
menu.add(1, Menu.FIRST, Menu.FIRST, "backup DB").setIcon(R.drawable.ic_action_save);
menu.add(1, Menu.FIRST+1, Menu.FIRST+1, "import DB").setIcon(R.drawable.ic_action_upload);
return super.onCreateOptionsMenu(menu);
}
(...)
public boolean onOptionsItemSelected(MenuItem item){
switch(item.getItemId()){
case 1:
backupDatabase();
return true;
case 2:
importDatabase();
return true;
default:
break;
}
return super.onOptionsItemSelected(item);
}
private void backupDatabase(){
try{
File sd = Environment.getExternalStorageDirectory();
File data = Environment.getDataDirectory();
if (sd.canWrite()) {
String currentDBPath = "//data//challenge.main//databases//DBCHALLENGES";
String backupDBPath = "DBCHALLENGES";
File currentDB = new File(data, currentDBPath);
File backupDB = new File(sd, backupDBPath);
FileChannel src = new FileInputStream(currentDB).getChannel();
FileChannel dst = new FileOutputStream(backupDB).getChannel();
dst.transferFrom(src, 0, src.size());
src.close();
dst.close();
Toast.makeText(getBaseContext(), "Successfully backed up database!", Toast.LENGTH_LONG).show();
}
}catch (IOException e){
Toast.makeText(getBaseContext(), "Error in backing up database!", Toast.LENGTH_LONG).show();
}
}
private void importDatabase(){
datasource = new CustomDataSource(this);
datasource.open();
try{
datasource.importDatabase("DBCHALLENGES");
Toast.makeText(getBaseContext(), "Successfully imported database!", Toast.LENGTH_LONG).show();
}catch (IOException e){
Toast.makeText(getBaseContext(), "Error in importing database!", Toast.LENGTH_LONG).show();
}finally{
datasource.close();
}
}
в моем CustomDataSource
:
public boolean importDatabase(String dbPath) throws IOException{
return dbHelper.importDatabase(dbPath);
}
и, наконец, в DBHelper
простирающейся SQLiteOpenHelper
public boolean importDatabase(String dbPath) throws IOException{
close();
File newDB = new File(dbPath);
File oldDB = new File("//data//challenge.main//databases//DBCHALLENGES");
if(newDB.exists()){
FileUtils.copyFile(new FileInputStream(newDB), new FileOutputStream(oldDB));
getWritableDatabase().close();
return true;
}
return false;
}
Однако, нажав на импорт Button
, появляется положительный Toast
, говорящий, что импорт был успешным. Но мое приложение, пустое до, все еще пустое. Предполагается, что резервная база данных будет расположена на первом уровне внутреннего хранилища, что она делает. Я думаю, может быть, я что-то путаю с путями, но я не могу понять, что именно.
тривиальными, но просто просят, вы установите разрешение для хранения в файле манифеста? –
, конечно, если подумать иначе, я бы даже не мог экспортировать db –
@ValentinoRu: Почему вы используете '//' в качестве разделителя путей? Он должен быть просто '/' например, 'new File ("/data/challenge.main/databases/DBCHALLENGES ");' – Squonk