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

时间:2013-12-07 14:05:26

标签: android virtual-device-manager

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

public class DatabaseHandler extends SQLiteOpenHelper
{
    @Override
    public void onCreate(SQLiteDatabase database)
    {
        database.execSQL(sql_command);
    }
}

每当我卸载应用程序时,应该从(虚拟)设备中完全删除数据库,对吗?但是当我重新安装它并在execSQL()行中放置一个断点时(在执行该方法之前),我可以通过SQLite Manager选项卡看到数据库与以前一样:类别表只有_id,名称,描述,current_level和status。

当前的sql命令是(注意Category表中的新图像列):

create table categories(
_id integer primary key autoincrement,
name text not null,
description text not null,
current_level integer DEFAULT 0,
status integer DEFAULT 0,
image text not null);

create table levels(
_id integer primary key autoincrement, 
category_id integer not null, 
level integer, 
total_questions integer, 
answered_questions integer DEFAULT 0, 
correct_answers integer DEFAULT 0, 
time integer DEFAULT 0);

不仅插入了图像列,而且水平表也没有显示在数据库中。此外,当我运行execSQL()方法时,logcat选项卡上没有显示任何内容。

顺便说一句,我使用的是Ubuntu 12.10,Eclipse Juno和Android 2.2!

2 个答案:

答案 0 :(得分:0)

  

每当我卸载应用程序时,应该从(虚拟)设备中完全删除数据库,对吗?

如果您实际上正在卸载它,并且数据库位于内部存储上的正常位置,那么是。

请注意,仅运行修改后的应用程序不会卸载旧版本。 替换旧版本,但所有数据都保持不变。

要删除内部存储上的现有数据库,您可以:

  • 真正卸载该应用,或

  • 在设置

  • 中点击您应用的清除数据

如果您更改了SQLiteOpenHelper将数据库放在外部存储上的行为,那么只有在getExternalFilesDir()getExternalCacheDir()或某些数据库中,数据库才会在卸载时删除那些子目录。如果将数据库放在外部存储的根目录中,则卸载后数据库将保持不变。

  

此外,当我运行execSQL()方法时,logcat选项卡上没有显示任何内容。

在上面显示的代码中,您没有将任何内容记录到LogCat。

答案 1 :(得分:0)

我不知道虚拟设备 - 但这是我用来从我的设备访问我的数据库

我在创建数据库之后把它放在其中一个活动中

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有一个环境变量,如果它没有,而不是adb,您需要指定它的整个路径,通常是/ platform-tools / adb

之后我在像SQLiteBroswer这样的数据库阅读器中打开数据库(尽管broswer非常多) 祝你好运!