如何在sqlite中打印打开的游标列表?

发布于 2024-11-18 09:29:58 字数 109 浏览 1 评论 0原文

是否有一个选项可以在 sqlite 中的某个时间点查看所有打开的游标? 我知道在 .Net 上有一些函数可以执行此操作(查看与数据库的所有连接...)

但是我可以用 sqlite 做什么?

Is there a option to see all the open cursors in some point of time in sqlite ?
I know that there is some functions to do this on .Net (to see all the connections to database...)

But what can I do with sqlite ?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

场罚期间 2024-11-25 09:29:58

我认为没有办法直接获取这些信息。不过,您可以做的是创建自己的 Cursor 子类,它跟踪静态列表中当前打开的 Cursor

例如(伪代码,未测试):

public class TrackingCursor extends SQLiteCursor {

    private static List<Cursor> openCursors = new LinkedList<Cursor>();

    public TrackingCursor(SQLiteDatabase db, SQLiteCursorDriver driver,
                          String editTable, SQLiteQuery query) {
        super(db, driver, editTable, query);
        openCursors.add(this);
    }

    public void close() {
        openCursors.remove(this);
    }

    public static List<Cursor> getOpenCursors() {
        return openCursors;
    }

}

您需要向数据库提供自己的工厂,以便创建您的 TrackingCursor 而不是普通的 SQLiteCursor

public class TrackingCursorFactory implements SQLiteDatabase.CursorFactory {

    Cursor newCursor(SQLiteDatabase db, SQLiteCursorDriver masterQuery,
                     String editTable, SQLiteQuery query) {
        return new TrackingCursor(db, masterQuery, editTable, query);
    }
}

最后,当您调用 openDatabase 时,通过将工厂作为参数传递来告诉数据库使用该工厂。

I don't think there's a way of getting this information directly. What you can do, though, is create your own subclass of Cursor which tracks the currently open Cursors in a static list.

For example (pseudo-code, not tested):

public class TrackingCursor extends SQLiteCursor {

    private static List<Cursor> openCursors = new LinkedList<Cursor>();

    public TrackingCursor(SQLiteDatabase db, SQLiteCursorDriver driver,
                          String editTable, SQLiteQuery query) {
        super(db, driver, editTable, query);
        openCursors.add(this);
    }

    public void close() {
        openCursors.remove(this);
    }

    public static List<Cursor> getOpenCursors() {
        return openCursors;
    }

}

You need to supply your own Factory to the DB, so that your TrackingCursors will be created instead of plain SQLiteCursors.

public class TrackingCursorFactory implements SQLiteDatabase.CursorFactory {

    Cursor newCursor(SQLiteDatabase db, SQLiteCursorDriver masterQuery,
                     String editTable, SQLiteQuery query) {
        return new TrackingCursor(db, masterQuery, editTable, query);
    }
}

And finally tell the DB to use this factory by passing the factory as a parameter when you call openDatabase.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文