我正在编写一些 SQLite 代码并想检查数据库。如果我在模拟器上运行代码,我可以使用 DDMS 文件管理器从 data\data\myProject\databases 中提取文件,但如果我在实际硬件上运行它,则无法访问 data\data 文件夹。除了获得手机的root访问权限之外,还有什么办法可以解决这个问题吗?
5 回答
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”替换为您的应用程序包的名称。
使用复制文件到 /mnt/sdcard
cp /data/data/<packagename>/databases/<dbname>/<filename> /mnt/sdcard
使用 adb,然后使用从 /mnt/sdcard 复制到您的桌面
adb pull /mnt/sdcard/<filename>
然后使用 sqlite3 来查看。
你必须root你的设备。转到命令提示符并转到 adb 所在的位置。
例如
C:\Program Files\Android\android-sdk\platform-tools
类型adb root
。现在转到您的文件资源管理器并检查。
我相信您的应用程序可以更改其本地存储数据文件的 unix 权限,以便其他应用程序和 adb 可以访问它们。
但是,您的应用程序无法更改安全电话的 /data 目录上缺少列表权限的情况。
结果,您将不得不使用“adb pull /full/path/to/file”来获取该文件 - 您无法浏览到它,因为您无法生成 /data 列表或文件的其他几个中间目录父级。
真正解决这个问题的唯一方法是将文件放在可以访问它的地方,就像在开发过程中放在 sdcard 上一样。然后,一旦您满意,事情就可以正常工作,将文件放在您想要的任何位置。
我这样说是因为我有一个零售 Nexus One 和开发者 Nexus One。在使用 DDMS 文件资源管理器时,我注意到我可以在开发人员设备上浏览数据文件夹,但不能在零售设备上浏览。我植根了我的零售设备,但没有帮助。
所以我想在这个问题上需要做更多的研究。但在那之前,我希望这会有所帮助。