Android 无根访问数据库
我已经进行了大量的搜索,试图找到一种不用安卓手机就可以访问db的方法,但都是徒劳的。我不想使用AVD,因为它非常慢。但为了查看我在做什么,我需要以某种方式从PC或手机访问app.db文件 /data/data//databases/.db不适用于实际设备Android 无根访问数据库,android,database,Android,Database,我已经进行了大量的搜索,试图找到一种不用安卓手机就可以访问db的方法,但都是徒劳的。我不想使用AVD,因为它非常慢。但为了查看我在做什么,我需要以某种方式从PC或手机访问app.db文件 /data/data//databases/.db不适用于实际设备 因此,请向我推荐一些查看数据库的方法。在应用程序中创建一个函数,将数据库从内部(受保护)内存复制到外部(不受保护),如SD卡。然后,您可以使用PC访问数据库(如果愿意,甚至可以从设备本身使用Android DB reader)。在应用程序中创建
因此,请向我推荐一些查看数据库的方法。在应用程序中创建一个函数,将数据库从内部(受保护)内存复制到外部(不受保护),如SD卡。然后,您可以使用PC访问数据库(如果愿意,甚至可以从设备本身使用Android DB reader)。在应用程序中创建一个函数,将数据库从内部(受保护)内存复制到外部(不受保护)内存,如SD卡。然后你可以用你的电脑访问它(如果你想的话,甚至可以从设备本身使用安卓DB阅读器)。只需在你的应用程序中添加特定事件的代码,它就会将DB复制到SD卡中,这将是你的DB/数据的副本,而不是实际的DB。从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) {
}
只需在应用程序中添加特定事件的代码,它将DB复制到SD卡中,它将是ur DB/数据的副本,而不是实际的DB。从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) {
}
我希望这能有所帮助。以下是我认为您需要的代码:
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包装器的构造函数中(当数据库不为null时)或者在onOpen中。如果仅在onCreate中,则下次运行应用程序时,.db已存在,由于某些原因,权限已更改回。这可能与Android如何管理其数据有关。我们只是将应用程序中的所有用户的文件权限设置为可读
if (BuildConfig.DEBUG)
{
new File(mDB.getPath()).setReadable(true, false);
}
然后用adb-pull获取.db
adb -d pull //data/data/xxxxx/databases/xxxxx.db .
注意:我发现每次打开数据库文件时都需要这样做,例如在onCreate中以及在SQLiteOpenHelper包装器的构造函数中(当数据库不为null时)或者在onOpen中。如果仅在onCreate中,则下次运行应用程序时,.db已存在,由于某些原因,权限已更改回。这可能与Android如何管理其数据有关。我试过这个。。私有静态最终字符串数据库_NAME=Environment.getExternalStorageDirectory().getPath();但是它不起作用。。你能给我一段代码吗?阿姆鲁特:请给我更多的启发。告诉我代码或方法。我现在不能谷歌。在过去的两天里,我一直在搜索4个项目&我没有找到任何有效的项目。我尝试了这个。。私有静态最终字符串数据库_NAME=Environment.getExternalStorageDirectory().getPath();但是它不起作用。。你能给我一段代码吗?阿姆鲁特:请给我更多的启发。告诉我代码或方法。我现在不能谷歌。在过去的两天里,我一直在找4本书&我没有找到任何有用的。布莱恩:谢谢你的帮助。但你的方法行不通。它显示的错误与我第一次尝试将数据存储在SD卡本身时显示的错误相同。您可以发布错误(catlog)吗?我的大多数项目中都有这段代码,而且效果很好。我一按按钮就用它。如果你想给我发一封电子邮件,我会把我使用这段代码的整个班级发给你,这可能会对你有所帮助。电子邮件地址是罗马的。appsllc@gmail.comBrian:谢谢你的帮助。但你的方法行不通。它显示的错误与我第一次尝试将数据存储在SD卡本身时显示的错误相同。您可以发布错误(catlog)吗?我的大多数项目中都有这段代码,而且效果很好。我一按按钮就用它。如果你想给我发一封电子邮件,我会把我使用这段代码的整个班级发给你,这可能会对你有所帮助。电子邮件地址是罗马的。appsllc@gmail.comIt实际上,对于您自己的应用程序是可能的,请参见