내 앱이 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로 반환되었습니다. 그것은 어떤 의미가 없습니다! 누구든지 어떤 통찰력을 가지고 있습니까? 모두에게 감사드립니다.
BatchOperationForSync 란 무엇입니까? 그리고 적절한 역 참조를 저장하고 있는지 확인하십시오. – Karan