0

Androidフォン(Sony Ericsson X-8 with Androidのバージョン2.1.1) にバックアップするコードを作成しましたsqlite dbfile

参考までに以下にコードを載せておきますが、読む前にX-8でも問題なく動作することを強調しておきます。[改善のための提案は大歓迎です!] Android のバージョン 4.0.4 を搭載した Sony Ericsson Xperia Arc で実行すると、問題が発生します。

ファイルはに書き込まれませSD card。ご存知かもしれませんが、USB カードを介して電話をコンピューターに接続すると、ファイルの書き込みが停止する可能性があるため、デバッグが非常に困難です (例: Android FileWriter が Sony Ericsson Arc では動作しないが、別の電話では動作する を参照)。

いずれにせよ、デバッガーでコードを調べても問題はなく、ファイルが書き込まれたと信じ込まされます。私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 に答える