私はいくつかのSQLiteコードに取り組んでおり、データベースを調べたいと思います。エミュレーターでコードを実行すると、DDMSファイルマネージャーを使用してdata\data\myProject\databaseからファイルをプルできますが、実際のハードウェアで実行すると、data\dataフォルダーにアクセスできません。電話へのルートアクセスを取得する以外にこれを回避する方法はありますか?
SQLIteデータベースは、実際には電話のメモリに保存されている単なるファイルであり、電話のSDカードにコピーして、PCから簡単にアクセスできます。以下は、まさに必要なことを実行する関数です。関数を使用する前に、必ずパッケージ名とデータベース名を変更してください。
public static void backupDatabase() throws IOException {
//Open your local db as the input stream
String inFileName = "/data/data/your.package.name/databases/database.sqlite";
File dbFile = new File(inFileName);
FileInputStream fis = new FileInputStream(dbFile);
String outFileName = Environment.getExternalStorageDirectory()
+ "/database.sqlite";
//Open the empty db as the output stream
OutputStream output = new FileOutputStream(outFileName);
//transfer bytes from the inputfile to the outputfile
byte[] buffer = new byte[1024];
int length;
while ((length = fis.read(buffer))>0){
output.write(buffer, 0, length);
}
//Close the streams
output.flush();
output.close();
fis.close();
}
コードからわかるように、データベースは常に次のフォルダに保存されます。
/data/data/your.package.name/databases/
名前(この例では「database.sqlite」)は、SQLiteOpenHelperを拡張するときに選択した名前です。もちろん、「your.package.name」をアプリケーションパッケージの名前に置き換える必要もあります。
あなたはあなたのデバイスをroot化する必要があります。コマンドプロンプトに移動し、adbが配置されている場所に移動します。
例えば.
C:\ Program Files\Android\android-sdk\platform-tools
タイプadb root
。次に、ファイルエクスプローラーに移動して確認します。
を使用してファイルを/ mnt/sdcardにコピーします
cp /data/data/<packagename>/databases/<dbname>/<filename> /mnt/sdcard
adbを使用してから、/ mnt/sdcardからデスクトップにコピーします。
adb pull /mnt/sdcard/<filename>
次に、sqlite3を使用して表示します。
あなたのアプリケーションは、ローカルストレージデータファイルのUNIXパーミッションを変更して、他のアプリケーションやadbからアクセスできるようになると思います。
ただし、アプリケーションは、セキュリティで保護された電話の/ dataディレクトリに対するリスト権限の欠如を変更することはできません。
その結果、「adb pull/full/path/to/file」を使用してファイルを取得する必要があります。/dataまたはファイルの他のいくつかの中間ディレクトリの親のリストを生成できないため、ファイルを参照することはできません。
本当にこれを回避する唯一の方法は、開発中にsdcardのように、ファイルにアクセスできる場所にファイルを配置することです。次に、満足したら、ファイルを好きな場所に正しく配置します。
私は小売りのNexusOneと開発者のNexusOneを持っているので、これを言います。 DDMSファイルエクスプローラーを使用しているときに、開発者用デバイスではデータフォルダーを参照できましたが、小売用デバイスでは参照できないことに気付きました。私は自分の小売デバイスをroot化しましたが、それは役に立ちませんでした。
ですから、この問題についてはもっと研究が必要だと思います。しかしそれまでは、これがお役に立てば幸いです。