0

내 앱이 Android 기본 연락처 관리자에 동기화 어댑터를 통합하려고 시도하고 있습니다. 연락처가 동기화되면 업데이트 할 수 없다는 것을 제외하고는 모두 원활하게 실행됩니다. 이 특정 문제에 대한 자세한 내용은 여기에서 확인할 수 있습니다. Android: Content resolver query returning 0 rows when it ought not to하지만 잘못된 URI를 쿼리하기 때문에 콘텐츠 확인자 쿼리가 0 값을 반환한다고 말하는 것만으로 요약 할 수 있습니다. 내가 전화에 원시 접촉 ID를 쓸 때Android : 원시 연락처 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에 이렇게 오전 : 나는 URI를 쿼리 할 때

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

을하지만, 나는 그래서 쿼리입니다 : 데이터에서

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

.CONTENT_URI. 나는 이것이 내 문제가 발생하는 곳이라고 생각한다. 안드로이드의 공식 개발 사이트에서 샘플 코드를 사용하여 내 용도로 맞춰 보았지만,이 부분은 예제에 잘 들어 맞습니다. 아직 작동하지 않습니다. 내 단서는 내가 말했던 것입니다. 저는 한 우 리에게 편지를 쓰고 다른 우 리에게 질문합니다. 하지만 쿼리를 RawContacts.CONTENT_URI (예외가 발생 함)로 변경하려고 시도했으며 예외를 발생시키는 Data.CONTENT_URI에 쓰는 Uri를 변경했습니다. 내가 rawcontactId을 돌려 커서를 얻을 경우

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; 
} 

그래서 참, 내가 왜 같은 열린 우리당를 조회 0 값을 얻을 것입니다 : 무엇보다 혼란스러운 것은 내 lookupRawContactId 방법을 수행 할 때 내가 Data.CONTENT_URI에서 원시 연락처 ID를 얻을 수 있다는 것입니다 저도 같은 rawcontactId로 반환되었습니다. 그것은 어떤 의미가 없습니다! 누구든지 어떤 통찰력을 가지고 있습니까? 모두에게 감사드립니다.

+0

BatchOperationForSync 란 무엇입니까? 그리고 적절한 역 참조를 저장하고 있는지 확인하십시오. – Karan

답변

0

lookupRawContactId 방법이 대신과 같아야합니다 쿼리 대신 RawContacts.CONTENT_URI를 검색하는

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; 
} 

공지 사항.

+0

JMRboosties, UserIdQuery.PROJECTION의 의미는 무엇입니까? UserIdQuery에 대해 무엇을 선언해야합니까? – AndroidRaji

+0

원시 연락처 ID가 필요합니다. 제발 RawContactID를 얻을 수 있습니다. – AndroidRaji

+0

static \t final 클래스 UserIdQuery {private UserIdQuery() {} \t public final static String [] PROJECTION = new String [] {RawContacts._ID }; public 최종 정적 int COLUMN_ID = 0; public static final String SELECTION = RawContacts.ACCOUNT_TYPE + "=" "+"com.tagapp.android "+" 'AND "+ RawContacts.SOURCE_ID +"=? "; } 커서 커서 = getContentResolver(). 쿼리 (RawContacts.CONTENT_URI, UserIdQuery.PROJECTION, UserIdQuery.SELECTION, 새 문자열 [] {first_name}, null); { if (cursor.moveToNext()) { authorId = cursor.getLong (UserIdQuery.COLUMN_ID);}} – AndroidRaji