How to get Contact ID, Email, Phone number in one SQLite query ? Contacts Android Optimization

后端 未结 2 1341
孤独总比滥情好
孤独总比滥情好 2020-12-07 21:20

I want to fetch All Contacts atleast with one phone Number, also I want all Phone Numbers and All emails for every Contact.

Current code :

// To get         


        
2条回答
  •  轻奢々
    轻奢々 (楼主)
    2020-12-07 21:50

    ICS: When you query from Data.CONTENT_URI you have all the rows from the associated Contact already joined - i.e. this would work:

    ContentResolver resolver = getContentResolver();
    Cursor c = resolver.query(
            Data.CONTENT_URI, 
            null, 
            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);
    }
    

    If you are targeting 2.3 you need to account for the fact that HAS_PHONE_NUMBER is not available through the joins used when querying Data.

    Fun.

    This could, for instance, be solved either by skipping your requirement that the contact must have a phone number and instead settle for "any contact with at least a phone number or an e-mail address":

    Cursor c = resolver.query(
            Data.CONTENT_URI, 
            null, 
            Data.MIMETYPE + "=? OR " + Data.MIMETYPE + "=?", 
            new String[]{Email.CONTENT_ITEM_TYPE, Phone.CONTENT_ITEM_TYPE},
            Data.CONTACT_ID);
    

    If that is not an option you can always go for a horribly hacky sub-select:

    Cursor c = resolver.query(
            Data.CONTENT_URI, 
            null, 
            "(" + Data.MIMETYPE + "=? OR " + Data.MIMETYPE + "=?) AND " + 
            Data.CONTACT_ID + " IN (SELECT " + Contacts._ID + " FROM contacts WHERE " + Contacts.HAS_PHONE_NUMBER + "!=0)", 
            new String[]{Email.CONTENT_ITEM_TYPE, Phone.CONTENT_ITEM_TYPE}, Data.CONTACT_ID);
    

    or solve it by using two Cursors:

    Cursor contacts = resolver.query(Contacts.CONTENT_URI, 
            null, Contacts.HAS_PHONE_NUMBER + " != 0", null, Contacts._ID + " ASC");
    Cursor data = resolver.query(Data.CONTENT_URI, null, 
            Data.MIMETYPE + "=? OR " + Data.MIMETYPE + "=?", 
            new String[]{Email.CONTENT_ITEM_TYPE, Phone.CONTENT_ITEM_TYPE}, 
            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);
                }
            }
        }
    }
    

提交回复
热议问题