質問

そのため、私のアプリは、同期アダプターをAndroidネイティブコンタクトマネージャーに統合しようとしています。これはすべて、連絡先が同期されたら、更新することができないことを除いて、すべてスムーズに実行されます。この特定の問題の詳細は、こちらをご覧ください。 Android:コンテンツリゾルバークエリは、すべきではないときに0行を返します しかし、私は間違ったURIをクエリしているので、私のコンテンツリゾルバークエリが0の値を返すだけであると言うだけで、単にそれをまとめることができます。

RAW連絡先IDを電話に書くとき、次のコードでそれを行います。

public ContactSyncOperations(Context context, String username,
        String accountName, BatchOperationForSync batchOperation) {

    this(context, batchOperation);
    mBackReference = mBatchOperation.size();
    mIsNewContact = true;
    mValues.put(RawContacts.SOURCE_ID, username);
    mValues.put(RawContacts.ACCOUNT_TYPE, "com.tagapp.android");
    mValues.put(RawContacts.ACCOUNT_NAME, accountName);
    mBuilder = newInsertCpo(RawContacts.CONTENT_URI, true).withValues(mValues);
    mBatchOperation.add(mBuilder.build());
}

このコンストラクターメソッドは、同期リストに新しい連絡先を追加するときに呼び出されます。

private static void addContact(Context context, String account, Contact contact, BatchOperationForSync batchOperation) {
    ContactSyncOperations contactOp = ContactSyncOperations.createNewContact(context, contact.getUsername(), account, batchOperation);//constructor called @ this line
    contactOp.addName(contact.getFirstName(), contact.getLastName());
    contactOp.addEmail(contact.getEmail());
    contactOp.addPhone(contact.getPhoneNumber(), Phone.TYPE_MOBILE);
    contactOp.addPhone(contact.getHomePhone(), Phone.TYPE_HOME);
    contactOp.addPhone(contact.getWorkPhone(), Phone.TYPE_WORK);
    contactOp.addProfileAction(contact.getUsername());
    Log.e("Adding contact", "Via sync");
}

コンストラクターでわかるように、私はnewinsertcpoと呼ばれる方法を呼んでいます。これはここで見ることができます。

private void addInsertOp() {
    if(!mIsNewContact) {
        mValues.put(Phone.RAW_CONTACT_ID, mRawContactId);
    }
    mBuilder = newInsertCpo(addCallerIsSyncAdapterParameter(Data.CONTENT_URI), mYield);
    mBuilder.withValues(mValues);
    if(mIsNewContact) {
        mBuilder.withValueBackReference(Data.RAW_CONTACT_ID, mBackReference);
    }
    mYield = false;
    mBatchOperation.add(mBuilder.build());
}

コードを見ることができるので、問題を説明させてください。 RAW連絡先IDを作成して作成するとき、私はrawcontacts.content_uriにそれを行っています:content_uri:

mBuilder = newInsertCpo(RawContacts.CONTENT_URI, true).withValues(mValues);

しかし、URIを照会すると、私はそうであるとクエリしています:

Cursor cursor = resolver.query(Data.CONTENT_URI, DataQuery.PROJECTION, DataQuery.SELECTION, new String[] {String.valueOf(rawContactId)}, null);

data.content_uriから。これが私の問題が発生している場所だと思います。 Androidの公式開発サイトのサンプルコードを使用し、自分の使用に合わせて調整しましたが、この部分は例にかなり忠実です。しかし、それは機能していません。私のリードは私が言ったことです、私はあるURIに手紙を書いて、別のURIを照会しています。しかし、クエリをrawContacts.content_uri(例外を引き起こした)に変更しようとしました。また、data.content_uriに書き込みます。さらに混乱しているのは、data.content_uriから生の連絡先IDを取得することです。LookUpRawContactIDメソッドを実行するとき:

private static long lookupRawContact(ContentResolver resolver, String username) {
    Log.e("Looking up Raw Contact", username);
    long authorId = 0;
    Cursor cursor = resolver.query(Data.CONTENT_URI, UserIdQuery.PROJECTION, UserIdQuery.SELECTION, new String[] {username}, null);

    try {
        if(cursor != null && cursor.moveToFirst()) {
            authorId = cursor.getLong(UserIdQuery.COLUMN_ID);
        }
    } finally {
        if(cursor != null) {
            cursor.close();
        }
    }
    return authorId;
}

ええ、rawContactidを返すカーソルを取得した場合、同じrawContactidで同じURIをクエリする0の値を取得するのはなぜですか?意味がありません!誰かが洞察を持っていますか?皆さんありがとう。

役に立ちましたか?

解決

lookuprawcontactidメソッドは、代わりに次のようになります。

private static long lookupRawContact(ContentResolver resolver, String username) {
    Log.e("Looking up Raw Contact", username);
    long authorId = 0;
    Cursor cursor = resolver.query(RawContacts.CONTENT_URI, UserIdQuery.PROJECTION, UserIdQuery.SELECTION, new String[] {username}, null);

    try {
        if(cursor != null && cursor.moveToFirst()) {
            authorId = cursor.getLong(UserIdQuery.COLUMN_ID);
        }
    } finally {
        if(cursor != null) {
            cursor.close();
        }
    }
    return authorId;
}

クエリがrawContacts.content_uriを検索していることに注意してください。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top