因此,我的应用正试图将同步适配器集成到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