如何在一个SQLite查询中获取联系人ID,电子邮件,电话号码?联系人Android Optimization

如何在一个SQLite查询中获取联系人ID,电子邮件,电话号码?联系人Android Optimization,第1张

概述我想通过一个电话号码获取所有联系人,我也想要每个联系人的所有电话号码和所有电子邮件。 当前代码: // To get All Contacts having atleast one phone number.Uri uri = ContactsContract.Contacts.CONTENT_URI;String selection = ContactsContract.Contacts. 我想通过一个电话号码获取所有联系人,我也想要每个联系人的所有电话号码和所有电子邮件。

当前代码:

// To get All Contacts having atleast one phone number.Uri uri = ContactsContract.Contacts.CONTENT_URI;String selection = ContactsContract.Contacts.HAS_PHONE_NUMBER + " > ?";String[] selectionArgs = new String[] {"0"};Cursor cu = applicationContext.getContentResolver().query(uri,null,selection,selectionArgs,null);// For getting All Phone Numbers and Emails further querIEs : while(cu.movetoNext()){String ID = cu.getString(cu.getColumnIndex(ContactsContract.Contacts._ID)); // To get Phone Numbers of Contact    Cursor pCur = context.getContentResolver().query(    ContactsContract.CommonDataKinds.Phone.CONTENT_URI,ContactsContract.CommonDataKinds.Phone.CONTACT_ID + "=?",new String[]{ID},null);// To get Email IDs of ContactCursor emailCur = context.getContentResolver().query(ContactsContract.CommonDataKinds.Email.CONTENT_URI,ContactsContract.CommonDataKinds.Email.CONTACT_ID + " = ?",null); // Iterate through these cursors to get Phone numbers and Emails}

如果我的设备中有超过1000个联系人,则需要花费太多时间。如何在单个查询中获取所有数据,而不是为每个联系人增加两个查询?

还是有其他的优化方法?

先谢谢你。

ICS:当您从Data.CONTENT_URI查询时,您已将所有相关联的联系人的行已加入 – 即这将工作:
ContentResolver resolver = getContentResolver();Cursor c = resolver.query(        Data.CONTENT_URI,Data.HAS_PHONE_NUMBER + "!=0 AND (" + Data.MIMETYPE + "=? OR " + Data.MIMETYPE + "=?)",new String[]{Email.CONTENT_ITEM_TYPE,Phone.CONTENT_ITEM_TYPE},Data.CONTACT_ID);while (c.movetoNext()) {    long ID = c.getLong(c.getColumnIndex(Data.CONTACT_ID));    String name = c.getString(c.getColumnIndex(Data.disPLAY_name));    String data1 = c.getString(c.getColumnIndex(Data.DATA1));    System.out.println(ID + ",name=" + name + ",data1=" + data1);}

如果您要定位2.3,则需要考虑到在查询数据时使用的连接不能使用HAS_PHONE_NUMBER。

乐趣。

例如,这可以通过跳过您的联系人必须具有电话号码的要求来解决,而不是解决“至少有一个电话号码或电子邮件地址的任何联系人”:

Cursor c = resolver.query(        Data.CONTENT_URI,Data.MIMETYPE + "=? OR " + Data.MIMETYPE + "=?",Data.CONTACT_ID);

如果这不是一个选项,你总是可以去一个可怕的黑客子选择:

Cursor c = resolver.query(        Data.CONTENT_URI,"(" + Data.MIMETYPE + "=? OR " + Data.MIMETYPE + "=?) AND " +         Data.CONTACT_ID + " IN (SELECT " + Contacts._ID + " FROM contacts WHERE " + Contacts.HAS_PHONE_NUMBER + "!=0)",Data.CONTACT_ID);

或使用两个游标来解决它:

Cursor contacts = resolver.query(Contacts.CONTENT_URI,Contacts.HAS_PHONE_NUMBER + " != 0",Contacts._ID + " ASC");Cursor data = resolver.query(Data.CONTENT_URI,Data.CONTACT_ID + " ASC");int idindex = contacts.getColumnIndexOrThrow(Contacts._ID);int nameIndex = contacts.getColumnIndexOrThrow(Contacts.disPLAY_name);int cidindex = data.getColumnIndexOrThrow(Data.CONTACT_ID);int data1Index = data.getColumnIndexOrThrow(Data.DATA1);boolean hasData = data.movetoNext();while (contacts.movetoNext()) {    long ID = contacts.getLong(idindex);    System.out.println("Contact(" + ID + "): " + contacts.getString(nameIndex));    if (hasData) {        long cID = data.getLong(cidindex);        while (cID <= ID && hasData) {            if (cID == ID) {                System.out.println("\t(" + cID + "/" + ID + ").data1:" +                         data.getString(data1Index));            }            hasData = data.movetoNext();            if (hasData) {                cID = data.getLong(cidindex);            }        }    }}
总结

以上是内存溢出为你收集整理的如何在一个SQLite查询中获取联系人ID,电子邮件,电话号码?联系人Android Optimization全部内容,希望文章能够帮你解决如何在一个SQLite查询中获取联系人ID,电子邮件,电话号码?联系人Android Optimization所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/sjk/1161906.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-01
下一篇 2022-06-01

发表评论

登录后才能评论

评论列表(0条)

保存