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