2017-09-11 14 views
1

RAW_CONTACT_ID & SOURCE_ID가 유용 할 수 있습니다. 하지만 프로그래밍 방식으로 찾을 수는 없습니다. 아래 코드는 제가 시도하는 코드입니다.연락처가 생성 된 소스 ID를 알고 싶다면 Google에서 만든 연락처가 있다면 고유 한 연락처 ID를 알고 싶습니다.

CursorWindow: Failed to read row 0, column -1 from a CursorWindow which has 2 rows, 38 columns. 

를 System.err : java.lang.IllegalStateException :

Cursor c = getContentResolver().query(ContactsContract.RawContacts.CONTENT_URI, new String[] 
    {ContactsContract.RawContacts._ID}, ContactsContract.RawContacts.CONTACT_ID + "=?", 
          new String[]{String.valueOf(cur.getString(cur.getColumnIndex(ContactsContract.Contacts._ID)))}, null); 
    try { 
     if (c.moveToFirst()) { 
      long rawContactId = c.getLong(0); 
      LogShowHide.LogShowHideMethod("== rawContactId ===", "" + rawContactId); 
     } 
    } finally { 
     c.close(); 
    } 
Log.e(TAG, "cur.getString(cur.getColumnIndex(ContactsContract.RawContacts.SOURCE_ID)): " + cur.getString(cur.getColumnIndex(ContactsContract.RawContacts.SOURCE_ID))); 
Log.e(TAG, "cur.getString(cur.getColumnIndex(ContactsContract.Contacts.Data.RAW_CONTACT_ID): " + cur.getString(cur.getColumnIndex(ContactsContract.Contacts.Data.RAW_CONTACT_ID))); 
Log.e(TAG, "cur.getString(cur.getColumnIndex(ContactsContract.Data.RAW_CONTACT_ID)): " + cur.getString(cur.getColumnIndex(ContactsContract.Data.RAW_CONTACT_ID))); 

나는 오류를 얻고 행 0을 읽을 수 없습니다, COL -1 CursorWindow에서. 커서가 데이터에 액세스하기 전에 커서가 올바르게 초기화되었는지 확인하십시오.

제 코드에 오류가 있음을 알려주세요.

업데이트 코드 : 당신이 그것을에 Cursor.close()라고 한 후에는 커서 읽기 위해 노력하고 Cursor cur = getContentResolver().query( ContactsContract.RawContacts.CONTENT_URI, new String[]{ContactsContract.RawContacts._ID, ContactsContract.RawContacts.SOURCE_ID}, ContactsContract.RawContacts.CONTACT_ID + "=?", null, null); try { if (cur.moveToFirst()) { long rawContactId = cur.getLong(0); LogShowHide.LogShowHideMethod("== rawContactId ===", "" + rawContactId); LogShowHide.LogShowHideMethod(TAG, "ContactsContract.RawContacts.SOURCE_ID: " + cur.getString(cur.getColumnIndex(ContactsContract.RawContacts.SOURCE_ID))); LogShowHide.LogShowHideMethod(TAG, "ContactsContract.Contacts.Data.RAW_CONTACT_ID: " + cur.getString(cur.getColumnIndex(ContactsContract.Contacts.Data.RAW_CONTACT_ID))); LogShowHide.LogShowHideMethod(TAG, "ContactsContract.Data.RAW_CONTACT_ID: " + cur.getString(cur.getColumnIndex(ContactsContract.Data.RAW_CONTACT_ID))); } } catch (Exception e) { e.printStackTrace(); } finally { cur.close(); }

답변

0
  1. , 지금 닫혀 더 이상 액세스 할 수 없음을 의미합니다. 마지막 세 줄을 try/finally 절로 이동하십시오.
  2. 당신은 당신의 프로젝션을 지정하지 않고 필드 RawContacts.SOURCE_ID에 액세스하려는 - 당신은 RawContacts.CONTENT_URI 테이블을 조회하여 Data.XXX에서 필드에 액세스하려는 new String[]{ RawContacts._ID, RawContacts.SOURCE_ID }
  3. 에 투영 변경이 가능하지, 당신은 쿼리해야 Data 필드가 필요한 경우 Data.CONTENT_URI 테이블
+0

감사합니다. 내 쿼리가 작동하지 않는 것을 확인하십시오. 커서를 수정하십시오. Cursor cur = getContentResolver(). ( ContactsContract.RawContacts.CONTENT_URI, new String [] {ContactsContract.RawContacts._ID, ContactsContract.RawContacts.SOURCE_ID}, ContactsContract. RawContacts.CONTACT_ID + "=?", null, null); –

+0

코멘트에 코드를 넣는 대신 질문을 업데이트해야합니다. 어쨌든, 선택 필드에서'?'를 사용한다면, 쿼리의 네번째 필드에 값을 입력해야합니다.'selectionArgs' – marmor