如何从 SQLite Openhelper 调试 SQLite 数据库?

How to debug SQLite database from SQLite Openhelper?

通常当我想查看 SQLite 数据库的内容时,我使用 sqlite3 executable 并给它如下命令:

.open MYDATABASE.db
SELECT * FROM myUserTable;

然后通过命令行输出我的table,很容易看到我数据库中的任何内容。

不幸的是,我正在使用的 SQLite 数据库甚至没有关联的 .db 文件。它从一个名为 SQLiteOpenHelper 的 class 扩展而来。 class 驻留在一个名为 DBHandler.java 的文件中,但在这种情况下显然尝试执行命令行语句(即我习惯的)失败。

有谁知道如何调试从 SQLiteOpenHelper 扩展的 SQLite 数据库?

您可以使用 cursor 查看您的 sqliteDb 的内容:

public Cursor selectRecords() {
   String[] cols = new String[] {USER_ID, USER_NAME};  
   Cursor mCursor = database.query(true, USER_TABLE,cols,null  
            , null, null, null, null, null);  
   if (mCursor != null) {  
     mCursor.moveToFirst();  
   }  
   return mCursor; // iterate to get each value.
}

您可以使用以下代码将数据库提取到设备上可访问的文件夹中:

try {
                    File sd = Environment.getExternalStorageDirectory();
                    File data = Environment.getDataDirectory();

                    if (sd.canWrite()) {
                        String currentDBPath = "/data/" + getPackageName() + "/databases/yourdatabasename";
                        String backupDBPath = "backupname.db";
                        File currentDB = new File(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) {

                }

然后使用您喜欢的工具打开您的file.db。

编辑:您需要在清单文件中添加在设备上写入的权限。

数据库必须存在。要找到它的名字,请参阅 DBHandler(如果扩展 SQLiteOpenHelper)将有一个类似这样的构造函数:

public DBHandler(Context context) {
  super(context, your_database_name, null, your_database_version);
  ...
}

数据库名称可以是任意的(有或没有任何扩展名)你会在/data/data/<your_package_name>/databases/<your_database_name>

中找到它

Here 您会找到有关访问此文件的一些建议。

警告:在模拟设备中授予内部文件访问权限,但必须对真实设备进行 root。您可以在您的应用程序中创建一个实用程序方法(仅在调试模式下)以自动化复制过程,如此处另一个答案中所述。

希望对您有所帮助!

可以使用intellij idea和数据库插件
数据库插件可以连接到您设备中的数据库,调试非常酷))