私のアプリケーションはまだ開発中であることを考慮すると、アプリケーションに接続されているデータベースに影響を与えるエラーが時々表示されます。何か問題が発生するたびに入力したくないテストデータが既にあるため、単純なインポート/エクスポート機能を実装したいと考えています。
私は最近、この質問に出くわしました。これは、多かれ少なかれ私が望んでいるものです。私のコードが実装されていることを示します。エクスポート機能は正常に動作し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
しかし、私のアプリケーションは以前は空でしたが、まだ空です。バックアップされたデータベースは、内部ストレージの最初のレベルにあると想定されています。パスと何かを混同しているのかもしれませんが、正確には何を通り抜けることができません。