我已编写代码将我的sqlite db
备份到我的Android手机上的file
(索尼爱立信X-8 w / 2.1.1版Android)。
我已将下面的代码作为参考,但在阅读之前,我强调它在X-8上运行良好。 [任何改进的建议仍然是最受欢迎的!]当我在索尼爱立信Xperia Arc w /版本4.0.4的Android上运行时,我遇到了问题。
文件未写入到SD card
。调试非常困难,因为您可能知道,通过USB卡将手机连接到计算机可以阻止文件被写入(例如:参见Android FileWriter not working on Sony Ericsson Arc but works on another phone)。
在任何情况下,遍历调试器中的代码都不会产生任何问题,并且会导致人们相信文件已写入。在我的manifest
中,我确实有:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
我对发生的事感到难过。在文件系统方面,Android的第2版和第4版之间有什么变化吗?它是手机专用的吗?
任何想法都会非常感激。 -Dave
String packageName = "com.xxx.receiver";
String dbName = "Receiver";
//File sd = Environment.getExternalStorageDirectory();
File sd = new File(Environment.getExternalStorageDirectory(), "xxx"); // "xxx" is never created on Arc!
if (!sd.exists()) {
sd.mkdirs();
}
File data = Environment.getDataDirectory();
if (sd.canWrite())
{
String currentDBPath = "//data//"+ packageName +"//databases//"+ dbName;
String backupDBPath = dbName;
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(SettingsAdapter.this.getContext(), backupDB.toString(), Toast.LENGTH_LONG).show();
}
答案 0 :(得分:0)
在从ICS开始的Android中,USB连接默认将设备作为媒体设备提供,而不是USB大容量存储设备。这样做的好处是,当您插入USB电缆时,外部存储不会“消失”,这当然使调试变得更加容易。缺点是,当您添加文件(或文件)时,您需要明确知道Android。
然而,这并不是非常困难:
File sd = new File(Environment.getExternalStorageDirectory(), "xxx" );
...
// create your file in xxx
...
sendBroadcast(
new Intent( Intent.ACTION_MEDIA_MOUNTED,
Uri.fromFile( sd ) )
)
);
作为附注,而不是硬编码数据库路径,您可以使用:
context.getDatabasePath( dbName );