从源码看ANDROID中SQLITE是怎么通过CURSORWINDOW读DB的

本文从源码角度探讨Android中SQLite如何通过CURSORWINDOW读取数据库。在执行query时,仅构造查询信息,不执行查询;在move系列函数中,首次执行会创建CursorWindow内存。真正耗时的fillWindow过程发生在moveToPosition时,如果超出CursorWindow范围,会重新填充数据。SQLite的并发实际上是串行执行,多线程读可能会遇到问题。不及时关闭Cursor可能导致CursorWindow内存泄露。建议在使用完毕后显式调用CLOSE()。
摘要由CSDN通过智能技术生成

从源码看ANDROID中SQLITE是怎么通过CURSORWINDOW读DB的

更多内容在这里查看
https://ahangchen.gitbooks.io/windy-afternoon/content/

执行QUERY

执行SQLiteDatabase类中query系列函数时,只会构造查询信息,不会执行查询。

(query的源码追踪路径)

执行MOVE(里面的FILLWINDOW是真正打开文件句柄并分配内存的地方)

当执行Cursor的move系列函数时,第一次执行,会为查询结果集创建一块共享内存,即cursorwindow

moveToPosition源码路径

FILLWINDOW—-真正耗时的地方

然后会执行sql语句,向共享内存中填入数据,

fillWindow源码路径

在SQLiteCursor.java中可以看到

@Override
public boolean onMove(int oldPosition, int newPosition) {
    // Make sure the row at newPosition is present in the window
    if (mWindow == null || newPosition < mWindow.getStartPosition() ||
            newPosition >= (mWindow.getStartPosition() + mWindow.getNumRows())) {
        fillWindow(newPosition);
   
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值