安卓:扩展用户的通讯录。Performance ContentProvider vs Sqlite vs List in Memory



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

当前设置

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

主要问题

有很多

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

我们的首要任务

第一:向用户展示通讯录时的性能。

第二:代码可维护性。

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

解决 方案?

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

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

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

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

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

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

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

Dan 的第二条评论是正确的..安卓使用屏幕下方的光标窗口缓存光标中的数据(约1M)。请参阅光标窗口上的Android文档,这就是光标适配器更快的原因。

如果您不喜欢单独连接两个表,则可以考虑使用更快的 CursorJoiner,这可以转到您的自定义内容提供程序,其中一个提供程序指向联系人并返回光标,类似地,第二个指向您自己的表并返回游标。游标连接器可以连接这两个游标。

(虽然这是一个复杂的过程)

最新更新