java - SQLite 查询的速度/昂贵与列表行上 "in-set"图标的 List.contains()

标签 java android

我正在开发的一个应用程序要求该应用程序在本地“图书馆”中维护本地事物列表,比方说书籍。用户可以访问他们本地的图书馆并使用远程网络服务搜索书籍。该应用程序将通过此 Web 服务了解该应用程序的其他用户,并且用户可以浏览其他用户在其图书馆中的图书列表。每本书都由唯一的 bookId 标识(表示为 int)。

查看通过搜索结果返回的图书或查看其他用户的图书库时,各个列表行单元格需要直观地表示该图书是否在用户的本 map 书馆中。用户最多可以在图书馆中拥有 5,000 本书,存储在设备上的 SQLite 中(并与远程 Web 服务同步)。

我的问题是,要确定列表行中显示的书是否在用户的图书馆中,直接询问 SQLite(通过 SELECT COUNT(*)...)会更好还是在内存中维护一个 Listint[] 数组,其中包含唯一的 bookId

因此,在每一行显示中,我是查询 SQLite 还是检查 Listint[] 数组是否包含唯一的 bookId?因为用户最多可以拥有 5,000 本书,每个 bookId 占用 4 个字节,所以最多使用 ~ 20kB。

在考虑和输入时,我觉得很明显,如果我维护一个列表或 int[] 库内 bookId 数组,性能会好得多与查询 SQLite(维护 int[] 数组的唯一注意事项是,如果添加或删除书籍,我将需要手动增大或缩小数组,因此使用此选项我很可能会使用 ArrayListVector,尽管我不确定使用 Integer 对象而不是基元会产生额外的内存开销。

意见、想法、建议?

最佳答案

首先,对于纯内存解决方案,我可能会使用 HashSet<Integer> HashMap<Integer> .它应该为 contains 提供更好的性能/ containsKey .其次,SQLite有自己的memory caching , 所以你不应该假设它每次都会天真地从磁盘读取。

关于java - SQLite 查询的速度/昂贵与列表行上 "in-set"图标的 List.contains(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2796252/

相关文章:

android - Android 6.0无法启动服务

android - onCreateOptionsMenu 未被调用

java - 如何显示 fragment 中相机看到的内容?

java - 日期 d = 新日期(0L); 0L在这个日期是什么意思?

Java 不断返回错误的答案

android - 将激光测距仪 (Bosch Disto GLM 50 C) 与智能手机 (Android Studio) 连接

android - 具体日期提前

android - 在 Android 中通过 Canvas 创建一个空位图并进行绘图

java - 在一个类中实现 SharedPreferences 以便能够从多个 fragment 中获取和保存数据

java - EWS API : Remove attendee and set "SendOnlyToChanged" sends update to everyone