【问题标题】:simple import/export option of a sqlite databasesqlite 数据库的简单导入/导出选项
【发布时间】: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


【解决方案1】:

试试这个:

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();
}

【讨论】:

  • InputStream mInput = new FileOutputStream(inputFileName); - 我认为应该是new FileInputStream(inputFileName)
  • 没问题。我认为这是一个错字。
  • 我想对于 inputfileName 我可以简单地采用“DBCHALLENGES”(因为它位于外部存储的第一层)?对于 outfileName 是“真实”数据库的路径? (目前无法测试,抱歉)。
猜你喜欢
  • 2011-09-26
  • 1970-01-01
  • 2019-11-12
  • 2013-05-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多