在虚拟设备上处理Android数据库
自从我两个月前启动应用程序以来,我在Android数据库方面遇到了很多麻烦。。。我看了很多教程,但只回答了几个问题。。。我放弃了使用我的(真实的)设备数据库,因为我无法访问它,所以我开始使用模拟器。但奇怪的事情发生了。我有这门课:在虚拟设备上处理Android数据库,android,virtual-device-manager,Android,Virtual Device Manager,自从我两个月前启动应用程序以来,我在Android数据库方面遇到了很多麻烦。。。我看了很多教程,但只回答了几个问题。。。我放弃了使用我的(真实的)设备数据库,因为我无法访问它,所以我开始使用模拟器。但奇怪的事情发生了。我有这门课: public class DatabaseHandler extends SQLiteOpenHelper { @Override public void onCreate(SQLiteDatabase database) {
public class DatabaseHandler extends SQLiteOpenHelper
{
@Override
public void onCreate(SQLiteDatabase database)
{
database.execSQL(sql_command);
}
}
每当我卸载应用程序时,数据库都应该从(虚拟)设备中完全删除,对吗?但是,当我重新安装它并在execSQL()行中放置一个断点时(在执行该方法之前),我可以通过SQLite管理器选项卡看到数据库与以前一样:category表只有_id、名称、描述、当前级别和状态
当前的sql命令是(注意类别表中的新图像列):
不仅插入了image列,而且level表也不会显示在数据库中。此外,当我运行execSQL()方法时,logcat选项卡上没有显示任何内容
顺便说一句,我正在使用Ubuntu 12.10、EclipseJuno和Android 2.2
每当我卸载应用程序时,数据库都应该从(虚拟)设备中完全删除,对吗
如果确实要卸载该数据库,并且该数据库位于其内部存储的正常位置,则选择“是”
请注意,仅运行修改后的应用程序不会卸载旧版本。它取代了旧版本,但所有数据保持不变
要清除内部存储上的现有数据库,您可以:
- 真正卸载应用程序,或
- 在设置中单击清除应用程序的数据
SQLiteOpenHelper
的行为以将数据库放在外部存储上,则只有在数据库位于getExternalFilesDir()
、getExternalCacheDir()
或其子目录时,才会在卸载时删除该数据库。如果将数据库放在外部存储的根目录中,则卸载后数据库将保持不变
此外,当我运行execSQL()方法时,logcat选项卡上没有显示任何内容
在上面显示的代码中,您没有将任何内容记录到LogCat。我不知道虚拟设备的情况-但这是我用来从设备访问数据库的方法 创建数据库后,我将其放在其中一个活动中
if (COPY_DB) {
try {
File sd = Environment.getExternalStorageDirectory();
String databaseName ="myDbName";
if (sd.canWrite()) {
String currentDBPath = Environment.getDataDirectory() + "/data/" + getPackageName() + "/databases/"+databaseName;
String backupDBPath =
Environment.getExternalStorageDirectory().getPath() +"/"+ databaseName+".db";
Log.d(TAG,"backupPath : "+backupDBPath);
File currentDB = new File(currentDBPath);
File backupDB = new File(sd, backupDBPath);
if (!backupDB.getParentFile().exists()) {
backupDB.getParentFile().mkdirs();
}
if (currentDB.exists()) {
FileInputStream fisc = new FileInputStream(currentDB);
FileOutputStream fosc = new FileOutputStream(backupDB);
FileChannel src = fisc.getChannel();
FileChannel dst = fosc.getChannel();
dst.transferFrom(src, 0, src.size());
fisc.close();
fosc.close();
src.close();
dst.close();
}
}
} catch (Exception e) {
Log.e(TAG, "error", e);
}
我打开命令行并转到要将数据库下载到的文件夹
写
c:\Dev\pulledFiles>adb pull the_path_of_the_file_from_the_log
这假设您的adb有一个环境变量,如果没有,则需要指定它的整个路径,通常是/platform tools/adb
之后,我在一个数据库读取器中打开数据库,比如SQLiteBroswer(尽管broswer有很多bug)
祝你好运 嗨,谢谢你的回复。我实际上是通过设置>卸载的(我的应用)>卸载。我尝试了两种方法,清除数据和卸载应用程序,但结果如上图所示。我没有改变数据库的位置,它在data/data/。。。目录关于logcat,如果sql命令出错,它不应该自动抛出异常吗?因为在创建表之后,我插入的行中的列不在上一个(错误的)类别表:image中。你还有什么建议吗/@user3077684:“关于logcat,如果sql命令出错,它不应该自动抛出异常吗?”--是的,因此您的sql没有错。卸载后,使用DDMS文件资源管理器确认您不再拥有与应用程序关联的
/data/data/
目录。如果该目录仍然存在,则表示您没有卸载该应用程序,或者您的仿真器严重损坏。如果目录不存在,则在创建新数据库时,onCreate()
的代码正在执行旧SQL,而不是新SQL。要快速卸载,只需在命令行中写入(再次假设环境变量)adb卸载com.mypackage.myapp这比转到“设置”并从中删除应用要快得多。这似乎没有什么意义:每次我(取消/重新)安装它时,都会发生不同的事情:在主活动中,我检查数据库是否确实被删除。当我转到需要数据库信息的活动时,就在execSQL()方法之前,我可以看到:创建了一个全新的数据库,或者使用旧的sql命令创建了一个新的数据库。。。Commonware,我想你所说的“那么你的onCreate()代码正在执行你的旧SQL”似乎就是这么回事。。。如何执行旧的sql?它缓存在什么地方了吗?什么时候发生的?@Fabiow:“旧的sql如何执行?”——大概是应用程序中的错误。嗨,莉娜,你所做的是将数据库复制到其他地方,对吗?我试过这篇文章,但它在adb shell->su上给出了“拒绝许可”。。。我用的是Ubuntu,我不知道这个过程是否相同,我会设法弄清楚。谢谢不需要su,您可以从应用程序内部将数据库复制到SD卡,然后从命令行下载文件并对其执行任何操作,我为您提供了此解决方案,因为您编写了“我无法访问设备上的db”
c:\Dev\pulledFiles>adb pull the_path_of_the_file_from_the_log