我的Android手机上有一个数据库,我需要将信息输入SD卡。
是否可以将数据库文件保存在可读状态的SD卡上?我无法找到有关如何执行此操作的任何信息。
将数据库文件复制到SD卡的一些源代码是理想的。
答案 0 :(得分:2)
数据库文件就像任何其他文件一样,如果您制作二进制文件副本,它将起作用。
Java没有内置文件复制方法,因此您可以使用:
Standard concise way to copy a file in Java?
请不要忘记添加您的清单权限以写入SD卡:
Permission to write to the SD card
答案 1 :(得分:0)
这是我在SO上与其他几个用户混淆的脚本。看起来你可以告诉android在哪里存储文件,但是当你使用adb shell进入手机时,你可能很难找到它!
此代码(我在操作栏中映射到临时按钮以进行调试)将打印如下内容:"数据库保存到:/storage/emulated/0/DB-DEBUG/todotable.db" ,但是进入我手机上的shell我实际上找到了我的数据库:" / storage / emulated / legacy / DB-DEBUG /" ...不确定是什么,但是现在我可以用sqlite浏览器查看我的数据库了!
//db will reside in: /storage/emulated/legacy/DB_DEBUG
private void copyDatabase(Context c, String DATABASE_NAME) {
String databasePath = c.getDatabasePath(DATABASE_NAME).getPath();
File f = new File(databasePath);
OutputStream myOutput = null;
InputStream myInput = null;
Log.d("testing", " testing db path " + databasePath);
Log.d("testing", " testing db exist " + f.exists());
if (f.exists()) {
try {
File directory = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + "/DB-DEBUG");
if (!directory.exists()){
directory.mkdir();
}
String copyPath = directory.getAbsolutePath() + "/" + DATABASE_NAME;
myOutput = new FileOutputStream(copyPath);
myInput = new FileInputStream(databasePath);
byte[] buffer = new byte[1024];
int length;
while ((length = myInput.read(buffer)) > 0) {
myOutput.write(buffer, 0, length);
}
myOutput.flush();
Toast.makeText(getBaseContext(), "Your database copied to: " + copyPath, Toast.LENGTH_LONG).show();
Log.d("testing", " database saved to: " + copyPath);
} catch (Exception e) {
Toast.makeText(getBaseContext(), e.getMessage(), Toast.LENGTH_LONG).show();
} finally {
try {
if (myOutput != null) {
myOutput.close();
myOutput = null;
}
if (myInput != null) {
myInput.close();
myInput = null;
}
} catch (Exception e) {
Toast.makeText(getBaseContext(), e.getMessage(), Toast.LENGTH_LONG).show();
}
}
}
}