在android中记录SQL查询

Vin*_*rat 53 sqlite logging android

我正在使用这些query函数来为我的表构建SQL查询.有没有办法看到运行的实际查询?比如把它记在某个地方?

到目前为止,我能做的最好的事情是使用断点查看游标的成员mQuery.我喜欢自动输出查询.该会员当然不公开,也没有吸气剂.


仅供记录,这是接受答案的实现.

/**
 * Implement the cursor factory in order to log the queries before returning 
 * the cursor
 * 
 * @author Vincent @ MarvinLabs
 */
public class SQLiteCursorFactory implements CursorFactory {

    private boolean debugQueries = false;

    public SQLiteCursorFactory() {
        this.debugQueries = false;
    }

    public SQLiteCursorFactory(boolean debugQueries) {
        this.debugQueries = debugQueries;
    }

    @Override
    public Cursor newCursor(SQLiteDatabase db, SQLiteCursorDriver masterQuery, 
                            String editTable, SQLiteQuery query) {
        if (debugQueries) {
            Log.d("SQL", query.toString());
        }
        return new SQLiteCursor(db, masterQuery, editTable, query);
    }
}
Run Code Online (Sandbox Code Playgroud)

Gra*_*and 36

您可以将自己的应用程序应用于SQLiteDatabase.CursorFactory数据库.(请参阅openDatabase参数.)这将允许您创建自己的子类Cursor,从而使查询保持在易于访问的字段中.

编辑:事实上,你甚至可能不必子类Cursor.只需让工厂的newCursor()方法返回标准SQLiteCursor,但在执行此操作之前记录查询.

  • 很好地工作,但这会在绑定任何参数之前显示查询.有没有办法在绑定所有提供的参数后查看查询? (7认同)
  • 这似乎适用于"读取"查询,但它不适用于插入和更新.是否有适用于插入和更新的解决方案? (6认同)

Tem*_*ema 33

adb shell setprop log.tag.SQLiteStatements VERBOSE
Run Code Online (Sandbox Code Playgroud)

设置此属性后,请不要忘记重新启动应用.

还可以启用执行时间的记录.有关详细信息,请访问:http: //androidxref.com/4.2.2_r1/xref/frameworks/base/core/java/android/database/sqlite/SQLiteDebug.java

  • 重启您的应用可能还不够.如果没有,也运行这些:`adb shell stop``adb shell start`这将重新启动所有内容,你将开始看到很多SQL. (7认同)

kon*_*mik 19

adb shell setprop log.tag.SQLiteLog V
adb shell setprop log.tag.SQLiteStatements V
adb shell stop
adb shell start


Jon*_*Jon 5

使用SQLiteQueryBuilder它非常简单.buildQuery()返回一个原始的sql字符串,然后可以记录:

SQLiteQueryBuilder qb = new SQLiteQueryBuilder();
qb.setTables(ExampleTable.TABLE_NAME);
String sql = qb.buildQuery(projection, selection, null, null, sortOrder, null);
Log.d("Example", sql);
Run Code Online (Sandbox Code Playgroud)

  • 自API等11以后弃用[来源](http://developer.android.com/reference/android/database/sqlite/SQLiteQueryBuilder.html) (5认同)