我正在开发的一个应用程序要求该应用程序在本地“图书馆”中维护本地事物列表,比方说书籍。用户可以访问他们本地的图书馆并使用远程网络服务搜索书籍。该应用程序将通过此 Web 服务了解该应用程序的其他用户,并且用户可以浏览其他用户在其图书馆中的图书列表。每本书都由唯一的 bookId
标识(表示为 int
)。
查看通过搜索结果返回的图书或查看其他用户的图书库时,各个列表行单元格需要直观地表示该图书是否在用户的本 map 书馆中。用户最多可以在图书馆中拥有 5,000 本书,存储在设备上的 SQLite 中(并与远程 Web 服务同步)。
我的问题是,要确定列表行中显示的书是否在用户的图书馆中,直接询问 SQLite(通过 SELECT COUNT(*)...
)会更好还是在内存中维护一个 List
或 int[]
数组,其中包含唯一的 bookId
。
因此,在每一行显示中,我是查询 SQLite 还是检查 List
或 int[]
数组是否包含唯一的 bookId
?因为用户最多可以拥有 5,000 本书,每个 bookId
占用 4 个字节,所以最多使用 ~ 20kB。
在考虑和输入时,我觉得很明显,如果我维护一个列表或 int[] 库内 bookId
数组,性能会好得多与查询 SQLite(维护 int[] 数组的唯一注意事项是,如果添加或删除书籍,我将需要手动增大或缩小数组,因此使用此选项我很可能会使用 ArrayList
或 Vector
,尽管我不确定使用 Integer
对象而不是基元会产生额外的内存开销。
意见、想法、建议?
最佳答案
首先,对于纯内存解决方案,我可能会使用 HashSet<Integer>
或 HashMap<Integer>
.它应该为 contains
提供更好的性能/ containsKey
.其次,SQLite有自己的memory caching , 所以你不应该假设它每次都会天真地从磁盘读取。
关于java - SQLite 查询的速度/昂贵与列表行上 "in-set"图标的 List.contains(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2796252/