13

我和我的 Android 团队遇到了问题。我们有一个应用程序可以显示用户的通讯录,以及扩展信息。

当前设置

我们的应用程序读取 Android 操作系统的联系人提供程序。将此信息发送到我们的服务器,该服务器为我们计算几个必要的字段。我们的应用程序稍后会获取此信息,并将此信息保存在 SQLite 数据库中。我们最终在数据库中得到的是两个表。一个包含所有数字和服务器为我们计算的所有额外信息。另一张表包含所有联系人(一个联系人可以有多个号码)。此联系人表仅为性能而创建;当为用户显示通讯录时,我们可以在 CursorAdapter 中使用 Cursor 选择此 Contacts 表中的所有行。因此,当向用户展示通讯录时,我们只需要从我们自己的 SQLite 数据库中读取,并且只需要一个表(例如没有 JOIN)。

主要问题

有很多同步正在进行。由于数据是重复的,我们需要检查添加/更改/删除,并且需要同步所有的时间。此外,当我们现在要更改表示层中的特定内容时,我们需要更改联系人表以包含此特定信息。

我们的优先事项

第一个:向用户展示通讯录时的表现。

第二:代码可维护性。

因此,不要评论“不要重复数据——这是所有问题的根源”。对我们来说,用户没有性能问题比我们作为开发人员必须花费一些额外的时间编写好的同步算法更重要。

解决方案?

我不知道为什么,但我一直认为 CursorAdapter(从一个表中读取所有行)的性能比带有对象列表(保存在内存中)的 ArrayAdapter 好得多。有谁知道这是不是真的?因为一个至少可以帮助我们一半的解决方案是,在启动时,加入 Contacts Provider(本机通讯录)和我们的扩展信息,将其保存在内存中的 List 中,并使用 ArrayAdapter 呈现。

创建自己的内容提供者?我对创建自己的内容提供商知之甚少。任何人都试图创建一个内容提供者来扩展本地通讯录的信息并加入这些信息。也许通过这个接口的实现:ContactsContract.DataColumnsWithJoins?有人尝试过类似的东西吗?在 CursorAdapter 中显示此信息时的性能如何?

请询问我可能忘记的更多信息,我会更新问题!

非常感谢您提供所有有用的提示和解决方案!

4

2 回答 2

1

我已经得出结论(在我的应用程序 JReader 上工作,它非常依赖于快速 DB 操作)Android 中的 SQLite 与其他平台一样快,但存在一些 Android 特定问题。关于数据库性能和您提出的问题的一些建议:

  • 如果您不打算通过它们共享数据,则内容提供者大多是无用的。但它们至少提供 2 个优势。首先,您会收到数据更改通知,并且光标会自动更新,第二个也是重要的:CursorLoaders 需要一个内容提供程序,如果性能对您很重要,我强烈建议使用它们来加载您的光标;
  • 访问集合比访问数据库要快得多,但这是一项双重工作,因为无论如何您都必须持久化数据,并且即使对于超快速滚动列表,特别是从单个表中获取数据,数据库访问也非常快,它应该不是问题;
  • 正确设计您的数据库(使用 JOINS、索引等):) 但不要在 CURSOR QUERIES 中使用 JOIN QUERIES!我在多个 Android 平台(包括 4.0+)上遇到了很多性能问题,但并非总是如此。我访问联合表的方式是先获取外键,然后查询子表。

根据我的经验,我遇到过数据库性能非常差的情况,但最终我总是设法调整代码,结果将获得 10-100 倍的性能提升。所以继续分析你的数据库代码,你肯定会达到预期的性能。

于 2013-02-05T21:09:42.933 回答
0

Dan 的第二条评论是真的 .. Android 使用屏幕下方的光标窗口来缓存来自光标的数据(大约 1M)。请参阅光标窗口上的 Android 文档,这就是光标适配器更快的方式。

If you do not prefer joining two tables seperately you could consider a CursorJoiner which is faster, This can go to your custom contentProvider where one of the provider is pointing to the Contacts and returns a Cursor , similarly the second one points to your own table and returns a cursor . The cursorjoiner can join both these cursors .

(Though it is a complicated process )

于 2013-02-05T22:11:46.543 回答