我在Android android developer's site或其他地方找不到与Android框架相关的问题。所以,我很想在这里问。
我在接受采访时被问到这些问题:
您如何评估Android中ContentProviders
的效率?
如果您想要获取3000个联系人需要多长时间? 如果您想要获取联系人的电子邮件,是否需要同样的时间?
答案 0 :(得分:2)
第一个问题
如果您想要获取3000个联系人需要多长时间?
- >取决于设备速度,无论如何,时间复杂度在输入大小上是线性的: O(n)
第二个问题
如果您想要将联系人的电子邮件提取为,则会花费相同的时间吗? 好?
- > AFAIK联系人的电子邮件位于数据表中,是原始联系人的子部分,每个联系人可能有多封电子邮件,因此您可能需要更多时间获取所有联系人的所有电子邮件,只获取联系人。
Contacts Provider是Android内容提供商组件。它维护关于一个人的三种类型的数据,每个数据对应于提供者提供的表,如
中所示
更多详情HERE
答案 1 :(得分:1)
您如何评估Android中ContentProviders的效率?
将通过查询延迟来评估。因此,您可以测量可能的查询的最差时间,将其与您的应用程序要求进行比较,看看它是否会为用户带来相当长的等待时间。
如果您想要获取3000个联系人需要多长时间?
运行代码并进行测量。在不同的设备和版本上会有所不同。
如果您想要提取联系人的电子邮件,是否需要同样的时间?
电子邮件和其他类型的"数据"可能是in same table。每条记录都是MIME类型的数据,所以" email"需要额外的记录提取。格式良好的查询可以一次性获取多种类型的数据,然后是最新的光标处理代码,以区分它。
答案 2 :(得分:0)
这只是表格问题中的select *。回答从表中选择(您需要的列)效率更高。
当投影仅包含您打算使用的列并且您有一个编码良好的循环来读取数据时,可以实现从内容提供程序读取的最佳情况。
如果为投影传递null,则将花费相同的时间,因为内容提供者的所有列都将返回到两个调用。
如果在第一次通话时传递了key_id用于投影而第二次传递你传递{key_id,key_email}第二次传递将花费更多时间,因为内容提供商正在返回更多数据
实际时间取决于您编码循环的程度以及您对循环中的数据执行的操作。例如,如果你执行getColumnIndex(“email”)的每个循环,它将比在进入循环之前确定列索引的优化程序花费更长的时间。
注意没有moveToFirst()这是sqllite的最快读取循环,第一次调用moveToNext()会为你执行moveToFirst()。
if (cursor !=null) {
//get column indexes here
while (cursor.moveToNext()){ //processing here }
}
cursor.close()}