복붙노트

[SQL] 내가) (ContentResolver.query이 안드로이드 쿼리를 수행 할 수 있습니까? (LEFT는 가입 CASE)

SQL

내가) (ContentResolver.query이 안드로이드 쿼리를 수행 할 수 있습니까? (LEFT는 가입 CASE)

나는 안드로이드에 (의사 코드) 다음과 같은 쿼리를 수행하기 위해 찾고 있어요 :

SELECT C.ID, C.NAME, CASE ISNULL(G.GROUPID,0) = 0 THEN 0 ELSE 1 END INGROUP
FROM CONTACTS C 
LEFT JOIN GROUPMEMBERSHIP G ON G.CONTACTID = C.ID AND G.GROUPID = ?

나는과 함께 기본 연락처 컨텐트 프로를 통해, 시스템의 주소록에있는 모든 연락처의 ID와 이름을 선택 찾고 있어요 0/1 필드는 연락처 그룹의 구성원인지 여부를 나타내는? .

내가 할 수 물론 충분히 쉽게 모든 연락처를 얻을 통해 다음 루프 내 어댑터 클래스에서 개별적으로 충분히 쉽게 쿼리 회원하지만, 하나 개의 외부 쿼리가 훨씬 더 나은 성능을 얻을 것입니다 합류로 나는 두 개의 쿼리를 수행 상상할 것입니다.

나는 표준 높은 수준의 문자열 프로젝션 및 ContentResolver.query () 메소드를 사용하여이 작업을 수행 할 수 있습니까? 또는 쿼리의이 종류는 더 직접적인 SQL 실행을 파고 필요?

해결법

  1. ==============================

    1.아니, 여러분은 ContentResolver.query () 메쏘드와 쿼리의 종류를 할 수 없습니다. 당신이 뭔가를 작성해야합니다 :

    아니, 여러분은 ContentResolver.query () 메쏘드와 쿼리의 종류를 할 수 없습니다. 당신이 뭔가를 작성해야합니다 :

    SQLiteDatabase db = YourActivity.getDbHelper().getReadableDatabase();
    String query = yourLongQuery;
    Cursor c = db.rawQuery(query, null);
    YourActivity.startManagingCursor(c);
    c.setNotificationUri(YourActivity.getContentResolver(), YourContentProvider.CONTENT_URI);
    
  2. ==============================

    2.편집 : 자신의 질문에 언급 된 eidylon은 기존의 컨텐트 프로에 연결되어 있기 때문에 좋아,이 실제로 문제가 해결되지는 물었다. 그러나, 이것은 당신이 컨텐트 프로 소스 및 API를 소유하는 경우가 가입 어떻게 커버를한다. 그래서 나는 그 사건을 처리하는 방법을 알고 싶은 사람들을 위해 떠날거야.

    편집 : 자신의 질문에 언급 된 eidylon은 기존의 컨텐트 프로에 연결되어 있기 때문에 좋아,이 실제로 문제가 해결되지는 물었다. 그러나, 이것은 당신이 컨텐트 프로 소스 및 API를 소유하는 경우가 가입 어떻게 커버를한다. 그래서 나는 그 사건을 처리하는 방법을 알고 싶은 사람들을 위해 떠날거야.

    이것은 쉬워요! 그러나 직관적 ... :)

    query(Uri uri, String[] projection, String selection, 
    String[] selectionArgs, String sortOrder)
    

    좋아, URI 무엇인가? 일반적으로 테이블 당 하나의 URI가 있습니다.

    내용 : //com.example.coolapp.contacts 귀하의 연락처 테이블의 데이터를 제공합니다. 내용 : //com.example.coolapp.groupmembers은 GROUPMEMBERSHIP 테이블의 데이터를 제공합니다.

    그러나 URI 정말 그냥 문자열입니다. 그것을 사용하지만 당신은 좋아한다. //com.example.coolapp.contacts_in_group : 응답 콘텐츠로 컨텐트 프로 코드 블록을 만듭니다. 컨텐트 프로에서 코드 블록 내에서 제한된 쿼리 () 데이터 모델에 의해 자유로운 당신의 SQLite는 DB에 원시 액세스를 얻을 수 있습니다. 그것을 자유롭게 사용!

    당신이 좋아하지만 당신의 선택 필드를 정의합니다. 그들은 테이블 열 이름에 매핑 할 필요가 없습니다 - 당신의 매개 변수를 얻기 위해, 당신이 필요로하는지에 매핑.

    조인 후이 두 테이블에서 열을 포함 할 수 있습니다 - 당신이 필요로하는 방법 프로젝션을 정의합니다.

    빙, 당신은 완료됩니다. 구글은 자신의 코드에서 내부적으로이 같은 모델을 수행 - 연락처 제공자 API의 이동 모습을 - 당신은 콘텐츠의 URI로 등 "bla.RawContact"와 "bla.Contact"를 참조하십시오. 각각은 DB에서 동일한 테이블 중 데이터를 제공 - 다른 URI를 그냥 같은 테이블의 다른보기를 제공합니다!

  3. ==============================

    3.컨텐트 리졸버는 하나의 쿼리 방법을 가지고 있기 때문에 당신은 할 수 없습니다 :

    컨텐트 리졸버는 하나의 쿼리 방법을 가지고 있기 때문에 당신은 할 수 없습니다 :

        query(Uri uri, String[] projection, String selection, 
    String[] selectionArgs, String sortOrder)
    

    테이블 또는 FROM 절에는 매개 변수가 없습니다.

  4. from https://stackoverflow.com/questions/6338802/can-i-perform-this-android-query-with-contentresolver-query-left-join-and-ca by cc-by-sa and MIT license