2012-11-07 2 views
0

Учитывая, что мое приложение все еще находится в разработке, время от времени появляется ошибка, которая влияет на мою базу данных, связанную с приложением. Поскольку я уже тестировал данные, я не хочу вводить каждый раз, когда что-то идет не так, я хочу реализовать простую функцию импорта/экспорта.простой вариант импорта/экспорта базы данных 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, говорящий, что импорт был успешным. Но мое приложение, пустое до, все еще пустое. Предполагается, что резервная база данных будет расположена на первом уровне внутреннего хранилища, что она делает. Я думаю, может быть, я что-то путаю с путями, но я не могу понять, что именно.

+0

тривиальными, но просто просят, вы установите разрешение для хранения в файле манифеста? –

+0

, конечно, если подумать иначе, я бы даже не мог экспортировать db –

+0

@ValentinoRu: Почему вы используете '//' в качестве разделителя путей? Он должен быть просто '/' например, 'new File ("/data/challenge.main/databases/DBCHALLENGES ");' – Squonk

ответ

2

Попробуйте это:

private void importDatabase(String inputFileName) throws IOException 
{ 
    InputStream mInput = new FileInputStream(inputFileName); 
    String outFileName = YOUR_DB_PATH_HERE; 
    OutputStream mOutput = new FileOutputStream(outFileName); 
    byte[] mBuffer = new byte[1024]; 
    int mLength; 
    while ((mLength = mInput.read(mBuffer))>0) 
    { 
     mOutput.write(mBuffer, 0, mLength); 
    } 
    mOutput.flush(); 
    mOutput.close(); 
    mInput.close(); 
} 
+1

'InputStream mInput = new FileOutputStream (inputFileName);' - Я думаю, что это должно быть 'new FileInputStream (inputFileName)' – Squonk

+1

@ Squonk: Ой ... опеча ... большое спасибо. –

+0

Нет проблем. Я подумал, что это опечатка. – Squonk

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