因此,我的應用正試圖將同步適配器集成到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我被退回了?它沒有任何意義!有沒有人有任何見解?謝謝大家。
什麼是BatchOperationForSync?並檢查你是否存儲正確的後退引用。 – Karan 2011-03-15 15:02:18