在虚拟设备上处理Android数据库

在虚拟设备上处理Android数据库,android,virtual-device-manager,Android,Virtual Device Manager,自从我两个月前启动应用程序以来,我在Android数据库方面遇到了很多麻烦。。。我看了很多教程,但只回答了几个问题。。。我放弃了使用我的(真实的)设备数据库,因为我无法访问它,所以我开始使用模拟器。但奇怪的事情发生了。我有这门课: public class DatabaseHandler extends SQLiteOpenHelper { @Override public void onCreate(SQLiteDatabase database) {

自从我两个月前启动应用程序以来,我在Android数据库方面遇到了很多麻烦。。。我看了很多教程,但只回答了几个问题。。。我放弃了使用我的(真实的)设备数据库,因为我无法访问它,所以我开始使用模拟器。但奇怪的事情发生了。我有这门课:

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