0

因此,我的應用正試圖將同步適配器集成到android本地聯繫人管理器。這一切都運行平穩,除非一旦聯繫人同步,我無法更新它。關於這個問題的詳細信息可以在這裏找到:Android: Content resolver query returning 0 rows when it ought not to但我可以簡單地說,只是說我的內容解析器查詢返回0值,因爲我查詢錯誤的URI,我相信。Android:使用Raw聯繫人ID正確訪問和查詢

當我寫的原始接觸ID到手機上,我用下面的代碼做到這一點:

public ContactSyncOperations(Context context, String username, 
     String accountName, BatchOperationForSync batchOperation) { 

    this(context, batchOperation); 
    mBackReference = mBatchOperation.size(); 
    mIsNewContact = true; 
    mValues.put(RawContacts.SOURCE_ID, username); 
    mValues.put(RawContacts.ACCOUNT_TYPE, "com.tagapp.android"); 
    mValues.put(RawContacts.ACCOUNT_NAME, accountName); 
    mBuilder = newInsertCpo(RawContacts.CONTENT_URI, true).withValues(mValues); 
    mBatchOperation.add(mBuilder.build()); 
} 

當你添加新的聯繫人同步列表此構造方法叫做:

private static void addContact(Context context, String account, Contact contact, BatchOperationForSync batchOperation) { 
    ContactSyncOperations contactOp = ContactSyncOperations.createNewContact(context, contact.getUsername(), account, batchOperation);//constructor called @ this line 
    contactOp.addName(contact.getFirstName(), contact.getLastName()); 
    contactOp.addEmail(contact.getEmail()); 
    contactOp.addPhone(contact.getPhoneNumber(), Phone.TYPE_MOBILE); 
    contactOp.addPhone(contact.getHomePhone(), Phone.TYPE_HOME); 
    contactOp.addPhone(contact.getWorkPhone(), Phone.TYPE_WORK); 
    contactOp.addProfileAction(contact.getUsername()); 
    Log.e("Adding contact", "Via sync"); 
} 

正如你可以在構造函數中看到,我調用了一個名爲newInsertCpo方法,可以在這裏看到:

private void addInsertOp() { 
    if(!mIsNewContact) { 
     mValues.put(Phone.RAW_CONTACT_ID, mRawContactId); 
    } 
    mBuilder = newInsertCpo(addCallerIsSyncAdapterParameter(Data.CONTENT_URI), mYield); 
    mBuilder.withValues(mValues); 
    if(mIsNewContact) { 
     mBuilder.withValueBackReference(Data.RAW_CONTACT_ID, mBackReference); 
    } 
    mYield = false; 
    mBatchOperation.add(mBuilder.build()); 
} 

現在你可以看到代碼,讓我解釋一下這個問題。當我創建和寫作的原始接觸式ID,我做這麼RawContacts.CONTENT_URI:

mBuilder = newInsertCpo(RawContacts.CONTENT_URI, true).withValues(mValues); 

然而,當我查詢URI,我查詢像這樣:

Cursor cursor = resolver.query(Data.CONTENT_URI, DataQuery.PROJECTION, DataQuery.SELECTION, new String[] {String.valueOf(rawContactId)}, null); 

從數據.CONTENT_URI。我相信這是我的問題發生的地方。我使用了Android官方開發站點的示例代碼,並將其定製爲我自己的用途,但這一部分對於該示例非常正確。但它不起作用。我的領導就是我所說的,我正在給一個Uri寫信並詢問另一個Uri。但我試圖將查詢更改爲RawContacts.CONTENT_URI(導致異常),並且還更改Uri,我將其寫入Data.CONTENT_URI,這也會導致異常。什麼是更令人困惑的是,我得到的原始聯絡人ID從Data.CONTENT_URI當我做我的lookupRawContactId方法:

private static long lookupRawContact(ContentResolver resolver, String username) { 
    Log.e("Looking up Raw Contact", username); 
    long authorId = 0; 
    Cursor cursor = resolver.query(Data.CONTENT_URI, UserIdQuery.PROJECTION, UserIdQuery.SELECTION, new String[] {username}, null); 

    try { 
     if(cursor != null && cursor.moveToFirst()) { 
      authorId = cursor.getLong(UserIdQuery.COLUMN_ID); 
     } 
    } finally { 
     if(cursor != null) { 
      cursor.close(); 
     } 
    } 
    return authorId; 
} 

所以啊,如果我得到一個返回遊標rawcontactId,爲什麼我會得到0值,查詢該URI用同樣的rawcontactId我被退回了?它沒有任何意義!有沒有人有任何見解?謝謝大家。

+0

什麼是BatchOperationForSync?並檢查你是否存儲正確的後退引用。 – Karan 2011-03-15 15:02:18

回答

0

的lookupRawContactId方法應該是這樣的,而不是:

private static long lookupRawContact(ContentResolver resolver, String username) { 
    Log.e("Looking up Raw Contact", username); 
    long authorId = 0; 
    Cursor cursor = resolver.query(RawContacts.CONTENT_URI, UserIdQuery.PROJECTION, UserIdQuery.SELECTION, new String[] {username}, null); 

    try { 
     if(cursor != null && cursor.moveToFirst()) { 
      authorId = cursor.getLong(UserIdQuery.COLUMN_ID); 
     } 
    } finally { 
     if(cursor != null) { 
      cursor.close(); 
     } 
    } 
    return authorId; 
} 

通知的查詢搜索RawContacts.CONTENT_URI代替。

+0

JMRboosties,請告訴我什麼是UserIdQuery.PROJECTION的意思。我應該爲UserIdQuery申報 – AndroidRaji 2012-09-27 04:54:18

+0

我需要Raw ContactID請聯繫我如何獲得RawContactID – AndroidRaji 2012-09-27 04:55:06

+0

static \t final class UserIdQuery {private UserIdQuery(){} \t public final static String [] PROJECTION = new String [] {RawContacts._ID }; public final static int COLUMN_ID = 0; public static final String SELECTION = RawContacts.ACCOUNT_TYPE +「='」+「com.tagapp.android」+「'AND」+ RawContacts.SOURCE_ID +「=?」; ();}};}};}};}}}遊標cursor = getContentResolver()。嘗試{cursor.moveToNext()) {authorId = cursor.getLong(UserIdQuery.COLUMN_ID);}} – AndroidRaji 2012-09-27 05:14:19