2011-07-21 22 views
1

私のアプリでは、MySQLiteデータベースを使用してユーザーのアプリケーションデータを保存しています。SDに作成したフォルダ内のSDカードにアプリケーションデータをバックアップできますカード(MyAppFolderと呼ぶ)。 SDカードスロットが1つしかないAndroid搭載端末では、すべて正常に動作します(たとえば、Droid)。複数のSDカードスロットを扱う方法

ただし、SDカードが1つ以上あるGalaxy Sなどのデバイスでは、動作しません。残念ながら、私は実際にこれらのデバイスのいずれかを持っていないので、私は何もデバッグすることはできません、私はユーザーのレポートだけで行くことができます。私もいくつかの検索を行い、これは既知の問題であることがわかりました。しかし、私は使用される他のパスをハードコーディングするだけでは解決されなかった解決策を見つけられなかったので、私はそれについていくつかの助けを求めています。

MyAppでは、MyAppFolderが既に存在するかどうかをチェックして確認します。そうでなければ、そのフォルダを作成します。このフォルダは、スロットが2つ存在する場合にgetExternalStorageDirectory()によって返される「内部」メモリスロットに作成されますが、常に正常に作成されます。ただし、ファイルが作成されてそこにコピーされることはありません。私はなぜフォルダが作成されたのかわかりませんが、ファイルは作成されません。

2つのカードスロットと1つのカードスロットで動作するようにこのコードを変更する方法を教えてもらえますか?チェックする場所をハードコードしたくないのですが、それが唯一の方法であれば、機能させるためにやっていきます。ここで

は、私が使用するコードは(少しここでは読みやすくするために変更)です:

File root = Environment.getExternalStorageDirectory(); 
String state = Environment.getExternalStorageState(); 
if(Environment.MEDIA_MOUNTED.equals(state)) 
{ 
    File dataDirectory = Environment.getDataDirectory(); 
    if (root.canWrite()) 
    { 
     String savePath = root + "/MyAppFolder/"; 
     File directory = new File(savePath); 
     if(!directory.exists()) 
     { 
      directory.mkdirs(); //folder created successfully 
     } 

     String currentDBPath = "\\data\\my_app\\databases\\database.db"; 

     File currentDB = new File(datDirectory, currentDBPath); 
     File backupDB = new File(savePath, "database.db"); 

     if (currentDB.exists()) 
     { 
      FileChannel src = new FileInputStream(currentDB[i]).getChannel(); 
      FileChannel dst = new FileOutputStream(backupDB[i]).getChannel(); 

      dst.transferFrom(src, 0, src.size()); 

      src.close(); 
      dst.close(); 
     } 
    } 

答えて

0

誰かが、私は2つのカードスロットを持つデバイスのために働くだけでなく、このコードを変更する方法を教えてもらえます1枚のカードスロット?

「外部ストレージ」は「リムーバブルストレージ」を意味しません。 「外部ストレージ」は「マウント可能なストレージ」を意味します.IOWでは、USBケーブルを使用してデバイスをホスト・マシンに接続すると、ユーザーはそのストレージにアクセスできます。

現在のところ、Androidは外部記憶ポイントに書き込むことができるように設計されており、固定フラッシュかリムーバブルなものかはデバイス製造元によって異なります。したがって、SDカードにバックアップしているとは考えずに、外部ストレージにバックアップする必要があります。

2つのカードスロットと1つのカードスロットで動作するようにこのコードを変更する方法を教えてもらえますか?

getDatabasePath()を使用すると、現在通過しているジャイレーションではなく、データベースパスを取得できます。 root + "/MyAppFolder/"を使用してパスを作成するために連結を使用しないでください - 他の場所と同じようにFileコンストラクタを使用してください。 WRITE_EXTERNAL_STORAGEの権限を持っていることを確認してください。それを超えると、デバイスが持つカードスロットの数にかかわらず、データベースを保持するのに十分な外部ストレージを備えたすべてのデバイスでうまく動作します。

+0

ありがとうございました。私はディレクトリをファイルディレクトリ=新しいファイル(Environment.getExternalStorageDirectory()、 "MyAppFolder")として作成すると、あなたはそれを提案していますか?内部DBパスの代わりにgetDatabasePath()を使用すると、Galaxy S(&類似のデバイス)で動作するようになりますか?私はこれをコード化するためのよりクリーンな方法だと理解していますが、最終的には、ファイルが正常に書き込まれるようにするために、現在何も行われていません。私は許可セットを持っており、これは私のDroidとエミュレータでうまく動作します。私はコードの変更を取得します。しかし、どのような行動が変更されていますか? – Michael

+0

@Michael: "Galaxy S(と類似のデバイス)"の外部ストレージへの書き込みに関する問題は認識していません。誰もそれらのデバイスの外部記憶装置に書き込むことができなかったら、私はそれについて聞いたことがある。ヘック、*あなたはそれについて聞いたことがあります。そのようなバグは主要なメディアのアウトレットでカバーされていたでしょうから。私はあなたが投稿したものから何が見えるのかをちょっとだけ指摘しています。あなたのコードにある問題が何であっても、それが外部ストレージにアクセスする方法を追跡するのに役立ちます。 – CommonsWare

+0

もう一度ありがとうございます。これを私に指摘したユーザーは、デバイスをコンピュータに接続しました。彼は両方のドライブを見ることができ、そこにMyAppFolderが座っているのを見ることができたと語った。しかし、フォルダ内にファイルはありませんでした。だから、私は、フォルダが正常に作成できる場合は、ファイルが同様に作成することができる必要がありますことを信じて狂っていないですか? getExternalStorageDirectory()によって返される領域にファイルを作成しようとすると失敗する可能性のある一般的な犯人に遭遇しましたか?なぜコードがDroidで動作するのか、Galaxy Sでは動作しないのか分かりません。 – Michael

関連する問題