编辑这个问题的假设是错误的,Android不会保持查询打开,但它可能会导致其他问题。见下面的讨论...
Android Cursor实现保留了下划线SQLite游标的滚动窗口,因此它可以实现"向前移动"。
但是我发现一个旧的SQLite文档说这是一个不好的做法,你不应该为UI输入打开查询:
https://www.sqlite.org/cvstrac/wiki?p=ScrollingCursor
另外例如Telegram使用它自己的SQLite包装器,并且没有滚动光标。 https://github.com/DrKLO/Telegram/blob/master/TMessagesProj/src/main/java/org/telegram/SQLite/SQLiteCursor.java。他们只有" next"
还有最佳实践"打电话给" getCount"在CursorLoader中,如果查看实现,它实际上会尝试遍历下划线查询中的所有数据。
Android的包装器实现不好吗? SQLite doc是否过时,可以保持查询打开吗?
答案 0 :(得分:0)
Android Cursor实现保留了一个滚动窗口 强调SQLite游标,因此它可以实现"向前移动"。
可滚动游标和不滚动游标都实现了move forward
,我认为你的意思是move backward
。
您指定的文档,并没有说明使用带有UI的可滚动游标是一种不好的做法。它说
进入,获取数据,然后离开。稍后,当用户决定时 向上或向下滚动(这通常是以后的时间 从你的CPU的角度来看,运行另一个查询来刷新 屏幕显示新数据。
据我所知,android游标正是以这种方式工作的。 Android SQLiteCursor
(实际上与SQLiteDatabase
类一起使用)是AbstractWindowedCursor
的子类。 AbstractWindowedCursor
在其中使用CursorWindow
,即根据文档:
包含多个游标行的缓冲区。
每次达到此缓冲区的限制时,AbstractWindowedCursor
会生成新的CursorWindow
并使用数据填充它。
P.S。事实上,这些窗口保留了相当多的数据。它不受屏幕尺寸的限制,远远超过5或50行(确切地说,它可以限制为5行甚至1行,如果您的行包含,例如,一千列),我们作为开发人员很少面对这样的行为。