0

我已经编写了代码来备份我sqlite dbfileAndroid 手机(Sony Ericsson X-8 w/ 2.1.1 版 Android)。

我将代码放在下面以供参考,但在阅读之前,我强调它在 X-8 上运行良好。[仍然欢迎任何改进建议!] 当我在带有 Android 4.0.4 版的索尼爱立信 Xperia Arc 上运行它时,我遇到了问题。

该文件未写入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 在文件系统方面是否发生了变化?是手机专用的吗?

任何想法将不胜感激。-戴夫

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

1 回答 1

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 );
于 2013-03-01T03:03:03.910 回答