1

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

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

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

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

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!

4

2 回答 2

0

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

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

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

要摆脱现有的内部存储数据库,您可以:

  • 真正卸载应用程序,或

  • 在设置中为您的应用点击清除数据

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

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

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

于 2013-12-07T14:13:16.300 回答
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 有很多问题)祝你好运!

于 2013-12-07T14:16:55.493 回答