0

私のアプリケーションはまだ開発中であることを考慮すると、アプリケーションに接続されているデータベースに影響を与えるエラーが時々表示されます。何か問題が発生するたびに入力したくないテストデータが既にあるため、単純なインポート/エクスポート機能を実装したいと考えています。

私は最近、この質問に出くわしました。これは、多かれ少なかれ私が望んでいるものです。私のコードが実装されていることを示します。エクスポート機能は正常に動作し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しかし、私のアプリケーションは以前は空でしたが、まだ空です。バックアップされたデータベースは、内部ストレージの最初のレベルにあると想定されています。パスと何かを混同しているのかもしれませんが、正確には何を通り抜けることができません。

4

1 に答える 1

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();
}
于 2012-11-07T01:16:56.767 に答える