ディレクトリ階層を作成し、アセットから新しく作成したディレクトリにファイルをコピーしようとしています。ここで提供されているコード サンプルを stackoverflow で使用しましたが、うまくいきません。基本的に、私のコードは次のようになります。
InputStream in = getAssets.open(mydb.sqlite);
File dir = new File("/data/data/my.package/databases/");
dir.mkdirs();
out = new FileOutputStream("/data/data/my.package/databases/mydb.sqlite");
while ((len = in.read(buffer)) > 0)
{
out.write(buffer, 0, len);
}
out.flush();
out.close();
in.close
これはすべて、最初の起動時にメイン アクティビティ内で実行され、もちろん 1 回だけ実行する必要があります。コードを実行する前に存在する唯一のディレクトリは /data/ です。はい、これはデータベース ファイルですが、ファイルをコピーしただけで、データベース コードでアクセスしようとしていないので、この時点では問題ありません。
コードは例外をスローせず、dir.mkdirs() は true を返します。とにかく、ディレクトリは作成されず、ファイルはコピーされません。いくつかの場所で提案されているように、マニフェストに WRITE_EXTERNAL_STORAGE の権限行を追加しました.FWIW. コードをステップ実行すると、すべて問題ないように見えます。しかし、もちろんそうではありません。
ここで何を探す必要がありますか? ファイルのパーミッションの問題? コードはすべてがそこにあると考えているのに (つまり、コピー コードに到達したときに FileNotFoundException をスローしない)、実際にはファイル システムに何もないのはなぜですか?
編集:これが私が学んだことです。getDir() は、/data/data/my.package/app_* にディレクトリを作成します。ディレクトリ名にこのプレフィックスを使用する理由がわかりません。データベース/またはファイル/などの標準的な場所に何かを置く必要がある場合、これは機能しません。