我已经徒劳地进行了广泛的搜索,以找到一种无需 root 我的 android 手机即可访问 db 的方法。我不想使用 AVD,因为它很慢。但是为了查看我在做什么,我需要以某种方式从 PC 或手机访问我的应用程序 .db 文件。
/data/data//databases/.db 不适用于真实设备。
所以,请建议我一些可以查看我的数据库的方法。
在您的应用程序中创建一个函数,将数据库从内部(受保护)内存复制到外部(不受保护),例如 SD 卡。然后,您可以使用您的 PC 访问它(如果您愿意,甚至可以从设备本身访问 Android DB 阅读器)。
只需在您的应用程序中添加特定事件的代码,它将数据库复制到 SD 卡中,它将是您的数据库/数据而不是实际数据库的副本。从 SD 卡您可以随时访问数据库。这是解决方法,但对我有用。
这是代码
try {
File sd = Environment.getExternalStorageDirectory();
File data = Environment.getDataDirectory();
if (sd.canWrite()) {
String currentDBPath = "data/"+sPackageName+"/databases/"+sDBName;
String backupDBPath = "/.appname-external-data-cache/"+sDBName; //"{database name}";
File dir = new File(sd,backupDBPath.replace(sDBName,""));
if(dir.mkdir()) {
}
File currentDB = new File(data, currentDBPath);
File backupDB = new File(sd, backupDBPath);
if (currentDB.exists()) {
FileChannel src = new FileInputStream(currentDB).getChannel();
FileChannel dst = new FileOutputStream(backupDB).getChannel();
dst.transferFrom(src, 0, src.size());
src.close();
dst.close();
}
}
} catch (Exception e) {
}
这是我认为您需要的代码:
try {
// Backup of database to SDCard
db.open();
File newFile = new File(Environment.getExternalStorageDirectory(), "BackupFileNameHere");
InputStream input = new FileInputStream("/data/data/com.YourProjectName/databases/DatabaseNameHere");
OutputStream output = new FileOutputStream(newFile);
// transfer bytes from the Input File to the Output File
byte[] buffer = new byte[1024];
int length;
while ((length = input.read(buffer))>0) {
output.write(buffer, 0, length);
}
output.flush();
output.close();
input.close();
db.close();
} catch (Exception e) {
}
我希望这有帮助。
我们只是将文件权限设置为应用程序内的所有用户都可以读取。
if (BuildConfig.DEBUG)
{
new File(mDB.getPath()).setReadable(true, false);
}
然后只需使用 adb -pull 获取 .db
adb -d pull //data/data/xxxxx/databases/xxxxx.db .
注意:我发现每次打开数据库文件时都需要执行此操作,例如在 onCreate 以及 SQLiteOpenHelper 包装器的构造函数(当您的数据库不为空时)或 onOpen 中。如果仅在 onCreate 中,则下次运行应用程序并且 .db 已经存在时,由于某种原因权限已被改回。这可能与 Android 如何管理其数据有关。