【发布时间】:2012-11-07 01:01:25
【问题描述】:
考虑到我的应用程序仍在开发中,有时会出现影响我与应用程序连接的数据库的错误。因为我已经有测试数据,不想每次出错都输入,所以想实现一个简单的导入/导出功能。
我最近偶然发现了this 问题,这或多或少是我想要的。我向您展示了我实现的代码。导出功能运行良好,我可以使用来自 android 市场的 SQLIte Database 应用程序对其进行测试。问题是进口。它向我显示了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,表示导入成功。但是我的应用程序,之前是空的,现在仍然是空的。备份的数据库应该位于内部存储的第一级,它的作用。我想,也许我把一些东西与路径混淆了,但我无法理解到底是什么。
【问题讨论】:
-
琐碎但只是问,您是否在清单文件中设置了存储权限?
-
当然,如果不这样认为我什至无法导出数据库
-
@ValentinoRu : 为什么使用
//作为路径分隔符?它应该只是/例如new File("/data/challenge.main/databases/DBCHALLENGES"); -
使用一个或两个'/'有什么区别吗?我在一个我现在找不到的示例中看到了这一点,以及如何说,导出与此路径一起使用
标签: android sqlite import backup