哪个更快 - 游标或 ArrayList?

Posted

技术标签:

【中文标题】哪个更快 - 游标或 ArrayList?【英文标题】:What is faster - a Cursor or ArrayList? 【发布时间】:2015-07-11 11:11:11 【问题描述】:

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

我的目标是最大化应用程序的性能,那么最快的检索方式是什么?

我可以想象2:

不断打开和关闭新游标

在开头查询所有数据,并将其存储在一个ArrayList中。更改数据时,使用indexOf 更改 SQLite DB 和 ArrayList。

----已编辑----

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

我曾考虑使用 CursorLoader,但由于我不需要与其他应用程序交互,因此我不想使用 Content Providers。

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

【问题讨论】:

你对数据做了什么?您是否在列表中显示它?如果你这样做,你应该查看CursorAdapter 【参考方案1】:

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

不断地调用和调用数据库确实会使您的应用成为性能瓶颈,特别是如果它是针对服务器而不仅仅是您的设备 SQLite 数据库。

根据您对数据的处理方式,您可以查看 CursorAdapter 之类的东西,它处理来自数据库的行的显示,并且每次插入/更新一行时,CursorAdapter 都会相应地更新 ListView。它还处理光标的打开/关闭/移动到下一个,使其可读性强,易于开发人员遵循。

不过,再次尝试在尽可能少的调用中做事。如果你坚持使用 ArrayList:

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

【讨论】:

【参考方案2】:

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

【讨论】:

是的,CursorLoaders 很棒。我会注意到(除非我错了)CursorLoader 仅在您的应用使用 ContentProvider 时才有效。【参考方案3】:

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

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

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

例如,如果您对 5 秒前有效的数据图片感到满意,那么您可能可以将数据本地缓存在阵列中,并安排一些机制以使其保持最新运行在幕后。

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

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

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

【讨论】:

以上是关于哪个更快 - 游标或 ArrayList?的主要内容,如果未能解决你的问题,请参考以下文章

ArrayList、LinkedList、HashMap哪个速度更快

ArrayList 还是 LinkedList 哪个运行得更快? [复制]

HashSet的contains()和ArrayList的contains()方法哪个更快一些?

PHP,单引号或双引号中哪个更快? [复制]

哪个更快: glob() 或 opendir()

什么时候 ArrayList 比在 C# 中使用数组更有效? [复制]