如何从SQLite Openhelper调试SQLite数据库



通常,当我想查看SQLite数据库的内容时,我会使用sqlite3可执行文件,并为其提供以下命令:

.open MYDATABASE.db
SELECT * FROM myUserTable;

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

不幸的是,我正在使用的SQLite数据库甚至没有关联的.db文件。它扩展自一个名为SQLiteOpenHelper的类。该类驻留在一个名为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。

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

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

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

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

数据库名称可以是任意的(有或没有任何扩展名),您可以在/data/data/<your_package_name>/databases/<your_database_name> 中找到它

在这里,您可以找到一些访问此文件的建议。

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

希望它能有所帮助!

最新更新