游标和ArrayList哪个更快?

问题描述 投票:0回答:3

我有一个 SQLite 数据库,我必须不断地从中检索数据。每次检索之间可能会对数据进行更改。

我的目标是最大限度地提高应用程序性能,那么最快的检索方法是什么?

我可以想象2:

  • 不断打开和关闭新光标

  • 首先查询所有数据,并将其存储在ArrayList中。更改数据时,使用

    indexOf
    更改 SQLite DB 和 ArrayList。

---- 已编辑 ----

我需要数据在谷歌地图中创建标记。

我考虑过使用 CursorLoader,但由于我不需要与其他应用程序交互,所以我不想使用内容提供程序。

创建自定义加载程序是个好主意吗?

java android sqlite arraylist database-cursor
3个回答
5
投票

简而言之,虽然事情并不总是那么简单,但最快的方法就是一次性完成所有事情。

不断地对数据库进行调用确实会造成应用程序性能瓶颈,特别是当它是对服务器而不仅仅是设备的 SQLite 数据库时。

根据您对数据所做的操作,您可能可以查看类似

CursorAdapter
的内容,它处理数据库中行的显示,每次插入/更新一行时,CursorAdapter 都会相应地更新 ListView。它还处理打开/关闭/移动到下一个光标,使其非常可读且易于开发人员遵循。

然而,再次尝试用尽可能少的调用来完成任务。如果您坚持使用 ArrayList:

  • 一开始就对所有项目进行一次调用。
  • 循环该光标并将项目添加到数组列表中。
  • 使用数组列表作为缓存。当然,您可以在每次更新列表时更新数据库(这可能是最安全的,IMO),或者您可以循环遍历列表并在应用程序关闭时插入/更新/删除。如果您采用这种方法,请确保使用像
    onPause()
    这样的方法来执行此操作,因为它是最早可以杀死 Activity 的方法之一。

2
投票

CursorLoader
的完美用例。给定一个查询,它将使您的列表适配器保持最新的数据,假设您在数据库中发生更改时发出通知。它还可以方便地为您处理活动生命周期事件(即,活动完成时它将关闭光标,暂停时会停止更新等)。


2
投票

最快的方法显然是根本不使用数据库。但是,这显然不是一个解决方案,除非您找到某种方法将您的阵列公开以从其他地方访问。

使用数据库是集中数据的一种便捷方式,因此许多用户可以访问数据并随时更新数据。不幸的是,这是最慢的选择。

在速度和可用性之间选择中间立场是一项艰巨的任务。您必须在陈旧数据和吞吐量之间找到平衡。

例如,如果您对 5 秒前有效的数据图片感到满意,那么您可能可以将数据本地缓存在数组中,并安排某种机制使其在后台运行时保持最新状态。场景。

如果 5 分钟的延迟可以接受,您可能可以安排定期推送到数据库。

此外,您使用的任何机制还必须处理数据的并行更改 - 也许两个用户同时更改相同的数据。

您只需要决定在哪里取得平衡即可。

© www.soinside.com 2019 - 2024. All rights reserved.