【问题标题】:Android - How the Cursor loads data from database when using query()?Android - 使用 query() 时光标如何从数据库中加载数据?
【发布时间】:2014-07-29 00:45:57
【问题描述】:

主要问题

游标如何从 SQlite 检索数据?它是否动态引用数据库文件地址?或将其完全加载到内存中?虽然我知道 dalvik 虚拟机是基于地址的,并且第一个假设更可能是正确的,因为 RAM 内存和手机存储的性质几乎相同。

所以我的主要问题是知道数据是如何加载的?从加载到内存?还是只是针对数据库文件内容?

澄清:(示例仅用于澄清,您可以跳过)

问题的提出是这样的:

我创建了一个应用程序,它从 sqlite 加载数据并在列表视图中显示它们。数据库随着时间的推移使用用户数据而增长。现在,当数据库变大时,是否需要以 load morepagination 的方式将数据加载到 listview 中?还是将它们加载到一个地方是真的? 虽然,分页会更好地响应,但是,当尝试将数据导出为 xls 或 pdf 格式时,是否可以将光标检索到所有数据库并将数据保存为 xls 或 pdf?

android 的消息应用程序将所有消息加载到一个位置,即使我在一个线程中有 3000 条消息也没有问题。

【问题讨论】:

  • 谢谢。但这似乎与我的问题不太相似。他们在那里谈论数据库优化。但是使用“分页”和“加载更多”的应用程序呢?他们只是在浪费时间吗?因为他们可以优化他们的数据库?我不是在谈论从网络加载数据的应用程序,而是关于像“viber”这样从数据库加载对话但也使用“加载更多”的应用程序。无论如何..我更新了我的问题以消除歧义。
  • 消息应用不会在屏幕上同时显示 3000 条消息。
  • 感谢您的评论。是的,我知道adapterView 以及它显示listview 视图的方式。但是游标本身的数据来自哪里?游标本身保存数据?或通过访问数据库文件动态加载它们?内存或文件..这就是问题:) –

标签: android sqlite


【解决方案1】:

似乎Cursor 的数据存储在内存或某种缓存文件中(这是我已经正确提到的实现细节)。 有两种可能的方法来证明/显示为什么它不是原始数据库文件。我相信还应该有某种更理论的解释。

  • 查看SQLiteCursor 源代码(在您的sdk 平台安装中可用):它基于CursorWindow,即

包含多个游标行的缓冲区。

CursorWindow 最初在本地创建和使用时是可读写的。 当发送到远程进程(通过将其写入 Parcel)时,远程 进程接收光标窗口的只读视图。通常情况下 光标窗口将由生产者分配,填充数据,并且 然后发送给消费者阅读。

此外,从源代码看来,Window 包含该缓冲区中的所有数据。

  • 使用包含大量记录的测试数据库创建测试应用程序。请求所有记录并显示在列表中。虽然列表显示不断更改数据库内容并观察列表内容没有更改(我假设消除使用 requery() 和相关的不推荐使用的东西)。

【讨论】:

    猜你喜欢
    • 2019-06-18
    • 2023-04-11
    • 1970-01-01
    • 2020-01-25
    • 2018-08-15
    • 2011-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多