2017-02-01 7 views
0

안드로이드 연락처 앱을 만들고 있으므로 정기적으로 사용자의 연락처를 읽고 앱에 저장합니다. 이를 위해, 나는 내 응용 프로그램에서 나는 업데이트해야하는 접촉 알 수 있도록하는 것이 ID의 어떤 종류에 의존 (또는 추가/삭제) 할 필요 Contacts Provider 그들 중 몇 가지 제공 :Android 연락처를 읽을 때 SOURCE_ID에 의존해야하나요?

  • CONTACT_ID가 집계 접촉 ID입니다 ,
  • 각 집계 접촉은 각각 하나 이상의 원료 연락처로 구성되어 자신의 RAW_CONTACT_ID,
  • 그리고 가장 중요한 것은, 각 원시 연락이 접촉이있는 ID, 즉 서버 ID 있어야하는 SOURCE_ID을 가지고 이 계정의 서버에 있습니다.

SOURCE_ID에 의존하는 것으로 선택했는데, 가장 안정적인 것 같습니다. 예 : 사용자가 기기에서 동일한 계정을 삭제했다가 다시 추가하면 내 앱에서 일치시킬 수 없으므로이 계정의 주소록에 다른 ID를 부여하지 않을 것입니다.

그러나 Gmail 동기화 어댑터는 아래에 설명 된 내용을 유지하는 것으로 보입니다. 불행하게도 Exchange 동기화 어댑터는 SOURCE_ID으로 변경되지 않으며 23:4과 같은 작은 숫자가 있으므로 서버 ID가 분명하지 않습니다.

질문 : 어떤 아이디어가이 문제를 극복 할 수 있습니까? 의도 한 용도로 오른쪽 ID을 사용하고 있습니까? Exchange 어댑터가 다른 필드에 "영구 서버 ID"를 저장합니까?

문서 다음 SOURCE_IDmust be unique for each account type and should be stable across syncs :

  • 고유 : 자체 소스 ID가 있어야합니다 계정에 대한 각 원료의 접촉. 이를 시행하지 않으면 연락처 응용 프로그램에 문제가 발생할 것입니다. 동일한 계정 유형 에 대한 원시 연락처 두 개가 동일한 소스 ID를 가질 수 있습니다. 예를 들어 [email protected] 계정의 원시 연락처 인 "Thomas Higginson"은 계정 [email protected]의 원시 연락처 인 "Thomas Higginson"과 동일한 출처의 ID를 가지고 있습니다 (예 : ).
  • 안정적 : 원본 ID는 원시 연락처의 온라인 서비스 데이터에 영구적으로 포함됩니다. 예를 들어 사용자가 Apps 설정에서 연락처 저장소 을 지우고 다시 동기화하는 경우 복원 된 원시 주소록은 이전과 동일한 소스 ID가 이어야합니다. 이를 시행하지 않으면 바로 가기가 작동하지 않습니다.

답변

0

우선, 그것은 응용 프로그램에서와 이드 시간이 지남에 따라 변경과 일치하지 않을 것으로 기대 이드를 저장하는 것은 좋은 생각이 아니다. 'SOURCE_ID'열에 대해서는 다른 두 가지에 비해 일관성이 있습니다 (CONTACT_ID은 가장 취약한 반면 'RAW_CONTACT_ID'은 사용자가 계정에서 로그 아웃하고 다시 로그인 할 때까지 지속됩니다).

연락처와 동기화 할 수있는 계정이 있으며 'raw_contacts'테이블 (SYNC1 - SYNC10)의 일반 용도 열 중 하나에 unique id을 보관했습니다.그래서 Google은 계정 제공 업체가 특정 방식으로 데이터베이스 열을 사용한다고 제안하지만 공급자 전체에게만 제공됩니다.

따라야 할 일반 규칙은 장기간 지속성을 위해 해당 ID를 사용하지 마십시오. 그렇게 할 경우 변경해야합니다. 또한 앱에 연락하기 때문에 어떤 종류의 참조 키가 필요합니다. 이 경우 규칙에 따라 모든 계정 제공자가 동일한 열에 키를 입력하지 마십시오. 그것은 부서지기 쉽지만 그것이 그 방법입니다.

편집 - ContactsColumns.LOOKUP_KEY를 사용해야합니다 (이전의 대답도 같은 인용).

LOOKUP_KEY API 레벨

추가의 행 ID가 동기화 또는의 결과로서 변경되었을 경우 연락처를 찾는 방법에 대한 힌트를 포함 5 문자열 LOOKUP_KEY 불투명 한 값 - 구글 문서에 따라 집합.

상수 값 : 당신이 API의 제공을 사용하여 연락처 ID가있는 경우 "조회"

https://developer.android.com/reference/android/provider/ContactsContract.ContactsColumns.html#LOOKUP_KEY

당신은 검색 키를 가져올 수 있습니다. 여기를 봐 - https://developer.android.com/reference/android/provider/ContactsContract.Contacts.html

+0

자, 그럼, 제가'ID '에 의지한다면 시간이 지남에 따라 변해야한다고 제안해야합니다. 그렇다면이 ID가 아닌 경우 어떤 참조를 사용하면 더 영구적으로 사용할 수 있습니까? –

+0

질문에 대한 답변은 다른 답변과 다릅니다. 당신이 사용해야하는 열쇠는'Contacts.LOOKUP_KEY'입니다. 일반적으로 조회 키는 많은 구성 요소에서 생성되는 복합 키입니다. 방금 내 대답을 편집했습니다 – Dibzmania

1

LOOKUP_KEY 당신이 찾고있는 것입니다.

LOOKUP_KEY

해당 행 ID가 동기화 또는 응집의 결과로서 변경되었을 경우 연락처를 찾는 방법에 대한 힌트를 포함하는 불투명 한 값.

당신은 연락처를 추적하기 위해 쌍에게 <CONTACT_ID, LOOKUP_KEY>를 사용해야합니다. 정상적인 사용에서 는 CONTACT_ID 값을 사용하지만, 코드가 (누락 또는 예상치 못한 연락처 이름 중 하나)을 CONTACT_ID이 변경되었음을 힌트를 얻는 경우에, 당신은 LOOKUP_KEY에이 새 연락처-ID를 찾을 수 있습니다.

Contacts.getLookupUri()을 사용하면 CONTACT_ID 또는 LOOKUP_KEY 실제 값이 무엇이든 상관없이 언제든지 연락처를 빠르게 찾을 수있는 URI를 얻을 수 있습니다.

+0

답장을 보내 주셔서 감사합니다. 그러나 계정을 제거하고 다시 추가하는 시나리오는 어떻게됩니까? 'LOOKUP_KEY'가 바뀔 것 같네요, 안 그래요? –

+0

LOOKUP_KEY는 안정된 ID를 의미하지 않으므로 변경 될 수 있습니다. ** 항상 Contacts.getLookupUri (id, key)를 사용하여 동일한 연락처 (예 : 아니오)를 가리키는 URI를 가져올 수 있습니다. 새로운 ID가 무엇인지에 상관없이). 조회 키에는 시스템에 '힌트'가 포함되어있어 연락처를 찾을 수있는 방법이 있습니다. – marmor

+0

감사합니다. 다음에 시도해주세요. –