哪个更快 - Cursor 或 ArrayList?
What is faster - a Cursor or ArrayList?
我有一个 SQLite 数据库,我必须不断地从中检索数据。每次检索之间可能会对数据进行更改。
我的目标是最大限度地提高应用性能,那么最快的检索方法是什么?
我能想象 2:
不断打开和关闭新游标
查询所有开头的数据,存入一个ArrayList。更改数据时,使用 indexOf
.
更改 SQLite DB 和 ArrayList
---- 已编辑----
我需要数据在 google 的地图中创建标记。
我考虑过使用 CursorLoader,但由于我不需要与其他应用交互,所以我不想使用内容提供程序。
创建自定义加载器是个好主意吗?
简而言之,虽然事情并不总是那么简单,但最快的方法就是一次完成。
不断地与数据库进行调用和从数据库调用确实会使您的应用程序性能瓶颈,尤其是当它是针对服务器而不仅仅是您的设备 SQLite 数据库时。
根据您对数据的处理方式,您可以查看 CursorAdapter
之类的东西,它处理数据库中的行显示,每次您 insert/update一行,CursorAdapter 将相应地更新 ListView。它还处理 opening/closing/moving 到 Cursor 的下一个,使其非常易读且易于开发人员遵循。
但是,请再次尝试在尽可能少的调用中完成任务。如果您坚持使用 ArrayList:
- 一开始就为所有项目打一个电话。
- 遍历该游标并将项目添加到数组列表。
- 使用数组列表作为缓存。当然,您可以在每次更新列表时更新数据库(这可能是最安全的,IMO),或者您可以循环遍历列表并在应用程序关闭时 insert/update/delete 。如果您采用这种方法,请确保使用
onPause()
之类的方法,因为它是可以杀死 Activity 的最早方法之一。
CursorLoader
的完美用例。给定一个查询,它将使您的列表适配器与最新数据保持同步,假设您在数据库中发生更改时通知您。它还可以方便地为您处理 activity 生命周期事件(即,它会在 activity 完成时关闭光标,在暂停时停止更新,等等)。
最快的方法显然是根本不使用数据库。但是,这显然不是解决方案,除非您找到某种方法公开您的数组以从其他地方访问。
使用数据库是一种集中数据的便捷方式,因此许多用户都可以访问数据并使数据始终处于最新状态。不幸的是,这是最慢的选择。
在速度和可用性之间选择中间地带是一项艰巨的任务。您必须在陈旧数据和吞吐量之间找到平衡点。
例如,如果您对 5 秒前有效的数据图片感到满意,那么您可能可以在数组中本地缓存数据并安排某种机制使其保持最新状态-日期 运行 在幕后。
如果可以接受 5 分钟的延迟,您可以安排定期推送到数据库。
此外,您使用的任何机制还必须处理对数据的并行更改 - 也许两个用户同时更改同一个数据。
您只需要决定在哪里取得平衡。
我有一个 SQLite 数据库,我必须不断地从中检索数据。每次检索之间可能会对数据进行更改。
我的目标是最大限度地提高应用性能,那么最快的检索方法是什么?
我能想象 2:
不断打开和关闭新游标
查询所有开头的数据,存入一个ArrayList。更改数据时,使用
indexOf
. 更改 SQLite DB 和 ArrayList
---- 已编辑----
我需要数据在 google 的地图中创建标记。
我考虑过使用 CursorLoader,但由于我不需要与其他应用交互,所以我不想使用内容提供程序。
创建自定义加载器是个好主意吗?
简而言之,虽然事情并不总是那么简单,但最快的方法就是一次完成。
不断地与数据库进行调用和从数据库调用确实会使您的应用程序性能瓶颈,尤其是当它是针对服务器而不仅仅是您的设备 SQLite 数据库时。
根据您对数据的处理方式,您可以查看 CursorAdapter
之类的东西,它处理数据库中的行显示,每次您 insert/update一行,CursorAdapter 将相应地更新 ListView。它还处理 opening/closing/moving 到 Cursor 的下一个,使其非常易读且易于开发人员遵循。
但是,请再次尝试在尽可能少的调用中完成任务。如果您坚持使用 ArrayList:
- 一开始就为所有项目打一个电话。
- 遍历该游标并将项目添加到数组列表。
- 使用数组列表作为缓存。当然,您可以在每次更新列表时更新数据库(这可能是最安全的,IMO),或者您可以循环遍历列表并在应用程序关闭时 insert/update/delete 。如果您采用这种方法,请确保使用
onPause()
之类的方法,因为它是可以杀死 Activity 的最早方法之一。
CursorLoader
的完美用例。给定一个查询,它将使您的列表适配器与最新数据保持同步,假设您在数据库中发生更改时通知您。它还可以方便地为您处理 activity 生命周期事件(即,它会在 activity 完成时关闭光标,在暂停时停止更新,等等)。
最快的方法显然是根本不使用数据库。但是,这显然不是解决方案,除非您找到某种方法公开您的数组以从其他地方访问。
使用数据库是一种集中数据的便捷方式,因此许多用户都可以访问数据并使数据始终处于最新状态。不幸的是,这是最慢的选择。
在速度和可用性之间选择中间地带是一项艰巨的任务。您必须在陈旧数据和吞吐量之间找到平衡点。
例如,如果您对 5 秒前有效的数据图片感到满意,那么您可能可以在数组中本地缓存数据并安排某种机制使其保持最新状态-日期 运行 在幕后。
如果可以接受 5 分钟的延迟,您可以安排定期推送到数据库。
此外,您使用的任何机制还必须处理对数据的并行更改 - 也许两个用户同时更改同一个数据。
您只需要决定在哪里取得平衡。