私はいくつかの SQLite コードに取り組んでおり、データベースを調べたいと思っています。エミュレーターでコードを実行すると、DDMS ファイル マネージャーを使用して data\data\myProject\databases からファイルを取得できますが、実際のハードウェアで実行すると data\data フォルダーにアクセスできません。電話へのルートアクセスを取得する以外に、これを回避する方法はありますか?
5 に答える
SQLIte Database は、実際には電話のメモリに保存された単なるファイルであり、電話の 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」をアプリケーション パッケージの名前に置き換える必要もあります。
デバイスをルート化する必要があります。コマンド プロンプトに移動し、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 ディレクトリに対する list 権限の欠如をアプリケーションで変更することはできません。
その結果、「adb pull /full/path/to/file」を使用してファイルを取得する必要があります。/data またはファイルの他のいくつかの中間ディレクトリの親のリストを生成できないため、参照できません。
これを回避する唯一の方法は、開発中にSDカードのようにアクセスできる場所にファイルを置くことです。次に、問題が解決されたら、必要な場所にファイルを配置します。
私がこれを言うのは、小売店の Nexus One と開発者の Nexus One があるからです。DDMS ファイル エクスプローラーを使用しているときに、開発者のデバイスではデータ フォルダーを参照できるが、製品版のデバイスでは参照できないことに気付きました。リテール デバイスをルート化しましたが、役に立ちませんでした。
したがって、この問題についてはさらに調査を行う必要があると思います。しかし、それまではこれが役立つことを願っています。