Android SQLite包装器在CursorAdapter中保持查询打开,这样好吗?

时间:2017-04-28 02:08:49

标签: android sqlite

编辑这个问题的假设是错误的,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是否过时,可以保持查询打开吗?

1 个答案:

答案 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行,如果您的行包含,例如,一千列),我们作为开发人员很少面对这样的行为。