Android:查询中内容提供商查询的性能成本

时间:2016-01-28 18:08:25

标签: android

动态写这个,所以我为代码示例道歉。这不是真正的代码,它是我在纯文本编辑器中即时编写的。没有编译检查,无法记住所有确切的类和方法名称等。它只是我想要做的事情的书面概念,我正在寻找关于更广泛的概念。

我正致力于从内容提供商处检索联系人列表。我希望能够根据联系人的帐户名称过滤结果。将向用户显示所有可用帐户,并将选择要使用的帐户,然后将在检索方法中使用。

问题是,帐户名称在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)有更好的方法吗?就像在一个查询中一样,获取我在光标中寻找的所有数据。

非常感谢。

0 个答案:

没有答案