run-as
Android 4.4.2では、-and-cat-to-sdcardソリューションは私にとってはうまくいきませんでした。よくわかりませんが、run-as
ツールが新しい権限sdcard_r
とsdcard_rw
権限を正しく処理していないことが原因である可能性があります。
最初に、データベースファイルを/files
アプリケーションのプライベート内部ストレージにコピーする必要がありました。
shell@hammerhead:/ $ run-as com.example.myapp
shell@hammerhead:/data/data/com.example.myapp $ cp databases/mydb files/mydb
それから私/sdcard/Android/data/com.example.myapp/files
はJavaland にコピーしました(これにはWRITE_EXTERNAL_STORAGE
許可が必要です):
public class MainActivity extends BaseActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
...
if (isExternalStorageWritable()) {
final FileInputStream input;
try {
input = openFileInput("mydb");
File output = new File(getExternalFilesDir(null), "mydb");
copy(input, output);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
public void copy(FileInputStream in, File dst) throws IOException {
OutputStream out = new FileOutputStream(dst);
// Transfer bytes from in to out
byte[] buf = new byte[1024];
int len;
while ((len = in.read(buf)) > 0) {
out.write(buf, 0, len);
}
in.close();
out.close();
}
public boolean isExternalStorageWritable() {
String state = Environment.getExternalStorageState();
return Environment.MEDIA_MOUNTED.equals(state);
}
}
最後に、ファイルをラップトップにコピーしました。
$ adb pull /sdcard/Android/data/com.example.myapp/files/mydb
SQLite format 3
文字列で始まるかどうかを確認します。また、正しいsqlite
バージョンであることを確認してください(つまり、sqlite2実行可能ファイルでsqlite3データベースを開こうとしているわけではありません)。また、他のSQLiteクライアント(SQLiteStudioなど)を試すこともできます。それが役に立てば幸い。