是否可以将数据库文件保存到SD卡?

时间:2011-10-12 18:42:58

标签: java android database save sd-card

  

可能重复:
  Is it possible to copy database file to SD card?

我的Android手机上有一个数据库,我需要将信息输入SD卡。

是否可以将数据库文件保存在可读状态的SD卡上?我无法找到有关如何执行此操作的任何信息。我知道数据库的名称和字段等......

我找到了一些示例,说明如何保存到SD卡,但不完全是我需要的。

将数据库文件复制到SD卡的一些源代码将是完美的。

希望这个问题很清楚。

2 个答案:

答案 0 :(得分:6)

是。这是我使用的功能:

public void copyDBToSDCard() {
    try {
        InputStream myInput = new FileInputStream("/data/data/com.myproject/databases/"+DATABASE_NAME);

        File file = new File(Environment.getExternalStorageDirectory().getPath()+"/"+DATABASE_NAME);
        if (!file.exists()){
            try {
                file.createNewFile();
            } catch (IOException e) {
                Log.i("FO","File creation failed for " + file);
            }
        }

        OutputStream myOutput = new FileOutputStream(Environment.getExternalStorageDirectory().getPath()+"/"+DATABASE_NAME);

        byte[] buffer = new byte[1024];
        int length;
        while ((length = myInput.read(buffer))>0){
            myOutput.write(buffer, 0, length);
        }

        //Close the streams
        myOutput.flush();
        myOutput.close();
        myInput.close();
        Log.i("FO","copied");

    } catch (Exception e) {
        Log.i("FO","exception="+e);
    }


}

对于我参与的项目,我在主屏幕中放置了一个菜单选项,我可以随时调用此功能。然后,我将数据库移动到我的桌面并使用FireFox的SQLite Manager插件打开它。

答案 1 :(得分:4)

不确定。如果这是您的应用程序中存在的数据库,则可以通过Context.getDatabasePath()获取对db文件的引用,并将其传递给数据库名称。从那里,它只是一个例行的文件复制操作:

//Get a reference to the database
File dbFile = mContext.getDatabasePath("mydb");
//Get a reference to the directory location for the backup
File exportDir = new File(Environment.getExternalStorageDirectory(), "myAppBackups");
if (!exportDir.exists()) {
  exportDir.mkdirs();
}
File backup = new File(exportDir, dbFile.getName());
//Check the required operation String command = params[0];

//Attempt file copy
try {
  backup.createNewFile();
  fileCopy(dbFile, backup);
} catch (IOException e) {
  /*Handle File Error*/
}

方法fileCopy()定义为:

private void fileCopy(File source, File dest) throws IOException {
  FileChannel inChannel = new FileInputStream(source).getChannel();
  FileChannel outChannel = new FileOutputStream(dest).getChannel();
  try {
    inChannel.transferTo(0, inChannel.size(), outChannel);
  } finally {
    if (inChannel != null) inChannel.close();
    if (outChannel != null) outChannel.close();
  }
}

HTH!