无法将sqlite db备份到某些Android手机上的文件。 mkdirs()有时不工作

时间:2013-02-28 21:48:58

标签: android sony mkdirs

我已编写代码将我的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(); 
                    }               

1 个答案:

答案 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 );