2014-12-04 86 views
5

我有几个关于Android框架的问题,我找不到android developer's site或其他地方。所以,我很想在这里问。如何评估Android中ContentProviders的效率?

有人问我这些问题在接受采访时表示:

您将如何评估ContentProviders在Android的效率?

如果您想要获取3000个联系人,需要多长时间? 如果您想要获取联系人的电子邮件,是否也需要同一时间?

+0

这似乎只是一个查询表中某列的时间差异问题,而且查询的不止一个。这应该归结为一个数据库问题,具体来说,在这种情况下,因为这是Android中的格式默认情况下,SQLite。或者我错过了什么? – 2014-12-04 04:43:19

+0

1)“效率”没有定义的含义。你可以回答任何你想要的。 2a)取决于设备及其速度。 2b)在不知道数据库模式的情况下不可能知道。而ContentProvider的情况更少,因为它们根本不需要拥有数据库。它们可以由RESTful Web服务支持。 – zapl 2014-12-09 00:27:13

回答

2

第一个问题

多少时间,如果你想获取3000个联系人没有考虑?

- >取决于设备速度,反正时间复杂度是在输入大小线性:为O(n)

第二个问题

将它采取相同的时间,如果你想获取联系人的电子邮件为 以及?

- > AFAIK联系人的电子邮件是在数据表的原料接触子部分,每个联系人可以有多个电子邮件,因此可能需要更多的时间来获取所有比较所有联系人的电子邮件以仅获取联系人。

联系人提供程序是Android内容提供程序组件。它维护三种类型的数据的一个人,每个对应于由供应商提供的表格,如

enter image description here

更多细节HERE

0

这只是一个select * from table问题。答案从表格中选择(需要的列)会更有效率。

当投影仅包含您打算使用的列并且您有一个编码良好的循环来读取数据时,可以实现从内容提供者读取的最佳情况。

如果您为投影传递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()} 
1

说明您将如何评估ContentProviders在Android中的效率?

这将通过查询延迟进行评估。因此,您可以对可能的查询进行最糟糕的时间测量,并将其与您的应用程序要求进行比较,并查看它是否会导致用户相当长的等待时间。

多少时间,如果你想获取3000个联系人没有考虑?

运行代码和度量。在不同的设备和版本上会有所不同。

如果您还想获取联系人的电子邮件,是否需要同一时间?

电子邮件和休息类型“数据”可能是in same table。每个记录是每个MIME类型的数据,因此“电子邮件”需要额外的记录提取。一个格式良好的查询可以一次获取多种类型的数据,然后通过其最新的游标处理代码来区分它。