1

RAW_CONTACT_ID & SOURCE_IDが役に立ちます。しかし、私はそれをプログラム的に見つけることはできません。以下は私が試しているコードです。連絡先が作成されたソースIDを知りたい場合は、Googleで作成した連絡先が一意の連絡先IDであることを知りたい場合は

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))); 

私はエラーを取得しています:

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

をSystem.err:java.lang.IllegalStateException:0行を読み取ることができませんでした、COL -1 CursorWindowから。カーソルがデータにアクセスする前に、カーソルが正しく初期化されていることを確認してください。

私のコードに誤りがありましたら教えてください。

更新コード: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. あなたはそれが今閉じますと、もはやアクセスすることはできませんを意味し、あなたがそれにCursor.close()を呼び出しした後、カーソルから読み取るしようとしています。 最後から3行をtry/finally節に移動します。
  2. あなたの投影でそれを指定せずにフィールドRawContacts.SOURCE_IDにアクセスしようとしている - new String[]{ RawContacts._ID, RawContacts.SOURCE_ID }
  3. に自分の投影を変更するには、RawContacts.CONTENT_URIテーブルを照会することにより、Data.XXXからフィールドにアクセスしようとしている、これは不可能である、あなたが照会する必要がありますDataのフィールドが必要な場合はData.CONTENT_URIテーブル。
+0

ありがとうございます。 Cursor cur = getContentResolver()。クエリ( )ContactsContract.RawContacts.CONTENT_URI、 新しいString [] {ContactsContract.RawContacts._ID、ContactsContract.RawContacts.SOURCE_ID}、 ContactsContract。 RawContacts.CONTACT_ID + "=?"、 null、 null); –

+0

コメントにコードを入れるのではなく、質問を更新する必要があります。とにかく、選択フィールドで '? 'を使用している場合は、クエリの第4フィールドに値を入れなければなりません。' selectionArgs' – marmor

関連する問題