如何从 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和数据库插件
数据库插件可以连接到您设备中的数据库,调试非常酷))
通常当我想查看 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和数据库插件
数据库插件可以连接到您设备中的数据库,调试非常酷))