2012-06-16 3 views
1

ContactsContract API에서 누락 된 것처럼 느껴집니다. 내 응용 프로그램에서 ContactsContract API의 Contacts 또는 Groups에 대한 참조가있는 SQLite 테이블이 여러 개 있습니다. 나는 내 자신의 접촉과 그룹 테이블을 가지고 바퀴를 재발 명하기보다는 이것을했다.Android 및 SQLite : ContactsContract API를 사용하여 쿼리에 참여하는 좋은 방법이 없습니까?

그러나 쿼리를 함께 사용하면 악몽이됩니다. 특정 그룹의 모든 연락처를 사용하여 SQL 테이블에서 조작을 수행한다고 가정합니다. ContactsContract를 쿼리하여 그룹 구성원의 contact_id를 가져오고 해당 contact_id를 문자열에 조인 한 다음 해당 문자열을 별도의 쿼리에 넣어야합니다. (또는 루프에 SQL 쿼리가 있습니다.)

이것은 잘못된 SQL 일 뿐이라고 생각합니다. 그러나 다른 방법으로 참조 할 수는 없습니다. 나는 내 자신의 연락처 목록을 유지하기 직전이다. 어떤 아이디어?

답변

3

아니요, 당신은 아무 잘못도 없을 것입니다. Contacts ContentProvider (그리고 내가 본 거의 모든 ContentProvider)는 일반적인 SQL 지식과 모순된다.

여러 유형의 ContactsContracts.CommonDataKinds에서 데이터를 가져 오려면 현재있는 행의 MIME 유형을 감지하고 어떤 유형의 엔티티인지 확인해야합니다 (또는 추가 쿼리를 작성해야합니다. 솔루션은 하나의 쿼리로 모든 것을 수행하는 것입니다.)

숨을 멈추고, 여기에 내가 그런 일을하기 위해 작성한 코드의 예가 있습니다. 서로 다른 행이 다른 종류의 엔티티가 될 수 있어야하며 일반 열에 여러 가지 데이터가 포함될 수 있으므로 CommonDataKinds. * 클래스를 사용하여 문맥적으로 참조하는 이유는 다음과 같습니다.

예이 완전히 심각한 해결책은 문자열 비교를 사용합니다. 더 좋은 방법이 있다면 알려주세요!

+0

와우, 얼마나 이상해. 고백 :이 대답을 기다리기 전에 나는 자신의 연락처 테이블을 만들었습니다. 내 기능은 더 짧고 우아합니다. 필자가 작성한 도우미 클래스는 제거되었습니다. 내 코드가 훨씬 좋아 보인다. 나는 그것이 더 효율적이라고 확신한다. 도와 주셔서 감사합니다. –

+1

나는 그것을 또한 할 것입니다. 당신이 실제로 SQL을 사용할 수 있도록 해결해야 할 복잡한 문제가 있다면 연락처를 관찰하고 자신의 DB로 임포트하십시오! –

+0

하나는 코드를 향상시킬 수 있지만 매우 명확하고 매우 유용합니다. 고마워요! – gor