动态写这个,所以我为代码示例道歉。这不是真正的代码,它是我在纯文本编辑器中即时编写的。没有编译检查,无法记住所有确切的类和方法名称等。它只是我想要做的事情的书面概念,我正在寻找关于更广泛的概念。
我正致力于从内容提供商处检索联系人列表。我希望能够根据联系人的帐户名称过滤结果。将向用户显示所有可用帐户,并将选择要使用的帐户,然后将在检索方法中使用。
问题是,帐户名称在RawContacts中,我想要的其他信息(显示名称,lookupID)位于Contacts中。我知道ContactsContract.Contacts.Entity是访问所有这些内容的快捷方式,所以这个代码示例是我计划做的。
同样,这是在没有IDE或查找方法或任何东西的情况下动态编写的。我确定我的语法在许多地方都很糟糕,但这显示了我试图做的概念。
private static final URI URI = ContactsContract.Contacts.URI;
private static final String[] FIRST_PROJECTION = new String[]{
ContactsContract.Contacts.DISPLAY_NAME,
ContactsContract.Contacts.LOOKUP_KEY
};
private String[] acceptedAccountNames = {Accepted Account Names Will Go Here (dynamic)};
private static final String[] SECOND_PROJECTION = new String[]{
ContactsContract.Contacts.Entity.ACCOUNT_NAME //This is whatever the entity -> RawContacts field name would be
};
public List<Contact> loadContacts(Context context){
List<Contact> contacts = new ArrayList<>();
ContentProvider provider = context.getContentProvider();
Cursor contactsCursor = provider.query(URI, FIRST_PROJECTION, null, null);
contactsCursor.movetoFirst();
while(!contactsCursor.isAtLast()){
String name = contactsCursor.getString(contactsCursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
long lookupKey = contactsCursor.getLong(contactsCursor.getColumnIndex(ContactsContract.Contacts.LOOKUP_KEY));
Uri idUri = Uri.makeWithId(URI, lookupKey);
Uri entityUri = Uri.makeWithTableName(idUri, "entity");
Cursor contactEntityCursor = provider.query(entityUri, SECOND_PROJECTION, null, null);
contactEntityCursor.moveToFirst();
String accountName = contactEntityCursor.getString(contactEntityCursor.getColumnIndex(ContactsContract.Contacts.Entity.ACCOUNT_NAME));
if(Arrays.asList(acceptedAccountNames).contains(accountName)){
Contact contact = new Contact(lookupKey, name);
contacts.add(contact);
}
contactsCursor.moveToNext();
}
return contacts;
}
如您所见,我在循环另一个光标时创建了一个光标。我实际上是为列表中的每个联系人创建一个新游标。
我的问题有两个:
1)这会对性能产生什么影响?有足够大的列表,这会严重损害应用程序的性能吗?
2)有更好的方法吗?就像在一个查询中一样,获取我在光标中寻找的所有数据。
非常感谢。