【问题标题】:How does a SQLite cursor work internally?SQLite 游标如何在内部工作?
【发布时间】:2012-05-09 17:45:32
【问题描述】:

我正在做一个需要在表格上存储位图的项目。这些位图用于数据适配器以显示在列表中。该表可能包含超过 1000 个图像。我目前不存储到文件的原因是因为我可以将图像读取和写入数据库的速度有多快。

我真正要寻找的是了解 SQLite 游标的局限性。光标是如何加载到内存中的?它将查询结果放在内存中还是创建某种类型的临时读/写文件?我不想遇到查询大型数据集导致设备内存不足的问题。

【问题讨论】:

  • CursorWindow,它似乎用于在您moveToXyz 时仅加载部分查询。数据应直接来自数据库。
  • “我正在做一个需要在表格上存储位图的项目。” ——咳。 “这张表可能包含超过 1000 张图像。” ——更恶心。 “我目前不存储到文件的原因是因为我可以将图像读取和写入数据库的速度有多快。” -- 根据定义,文件将同样快或更快,因为 SQLite 必须将其内容存储在文件中。
  • zapl 感谢您提供的信息。 @CommonsWare 不确定 ick 是什么意思:P 我认为从文件中读取似乎应该比从 db 读取更快或更快。除了如何使用游标之外,我对游标了解不多……但是 SQLite 没有高度优化您从数据中读取的方式吗?我的意思是多次从文件中读取图像数据似乎比从光标中读取要慢得多。
  • @Jona:那是因为Cursor 将内容保存在内存中。您也可以通过读取文件的结果来做到这一点。

标签: android sqlite database-cursor


【解决方案1】:

如果我记得的话,它会尽可能多地将结果缓存在内存中。通常,它应该保持在soft heap limit 之下。这是一个建议限制,因此它更愿意超过限制而不是返回 SQL_NOMEM。

我不相信它会为任何缓存机制写入磁盘。只要每张图片都可以放入内存,并且它们不在索引中,这应该不是问题。

我不是一个 android 程序员,因为它的价值。其中一些东西可以定制。

作为背景,sqlite_step 是默认库中的光标。我不知道android是否已经实现了它自己的机制。你可以在他们的页面上找到一些关于dynamic memory allocation的一般信息。

【讨论】:

    【解决方案2】:

    这是我以前发的一篇文章。我的解决方案是将图像保存到文件并将图像的路径保存到数据库表中。这更清洁,似乎更快。

    将大型二进制数据保存到表中的想法似乎不是正确的做法。我没有详细信息说明为什么这不是一个好主意,但这就是我通过一些研究得出的感受。

    【讨论】:

      猜你喜欢
      • 2017-06-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-13
      • 2010-10-14
      • 2013-09-28
      • 2012-08-01
      • 2011-12-10
      相关资源
      最近更新 更多