查询所有联系人的搜索

时间:2018-05-06 18:09:48

标签: java android

我正在尝试使用搜索查询搜索联系人,但某些内容似乎无法正常工作:

public class Callbacks implements LoaderManager.LoaderCallbacks<Cursor> {
    Context mContext;
    String query;
    public static final String QUERY_KEY = "query";
    public static final String TAG = "Callbacks";
    public Callbacks(Context context) { mContext = context; }

    @Override
    public Loader<Cursor> onCreateLoader(int loaderIndex, Bundle args) {
        query = args.getString(QUERY_KEY);
        ContentResolver cr = mContext.getContentResolver();
        Uri contentUri = Uri.withAppendedPath(ContactsContract.Contacts.CONTENT_FILTER_URI, Uri.encode(query));
        Uri fullContentUri = ContactsContract.Contacts.CONTENT_URI;
        return new CursorLoader(
            mContext, // Context
            contentUri, // Search this
            null, // Projection
            null, // Selection
            null, // Selection args
            null // Sort Order
            );
    }

    @Override
    public void onLoadFinished(Loader<Cursor> arg0, Cursor cursor) {
        if (cursor.getCount() == 0) return;
        cursor.moveToFirst();

        Log.d(TAG, "Search Query: " + query);
        while (cursor.moveToNext()) {
            String displayName =  cursor.getString(cursor.getColumnIndex(ContactsContract.Data.DISPLAY_NAME));
            Log.d(TAG, displayName);
        }
        cursor.close();
    }

    @Override
    public void onLoaderReset(Loader<Cursor> cursorLoader) {
    }
}

完整的联系人名单是艾米,凯文,约翰,乔,奥斯卡。 如果我把&#34; j&#34;作为查询,我只在光标中得到John(即使我应该得到John和Joe): D/Callbacks: Search Query: j John 如果我把&#34; a&#34;在查询中,即使我得到Amy,我也没有在游标中得到任何东西: D/Callbacks: Search Query: a

如果我用fullContentUri替换contentUri(在gist中定义),因此它不是过滤后的uri,无论查询如何,我都会按预期获得所有联系人: D/Callbacks: Search Query: j Amy Kevin Joe D/Callbacks: Oscar John

所以我的过滤有些不对劲......但根据这一点:https://developer.android.com/training/contacts-provider/retrieve-names看起来我做的一切都是正确的。

1 个答案:

答案 0 :(得分:2)

首先,您将光标移动到调用方法moveToFirst的第一个项目。然后,您将直接转到调用方法moveToNext的第二个。在这种情况下,您总是缺少第一个元素。解决方案应该是直接从第一项迭代:

@Override
public void onLoadFinished(Loader<Cursor> arg0, Cursor cursor) {
    if (cursor.getCount() == 0) return;

    Log.d(TAG, "Search Query: " + query);
    while (cursor.moveToNext()) {
        String displayName =  cursor.getString(cursor.getColumnIndex(ContactsContract.Data.DISPLAY_NAME));
        Log.d(TAG, displayName);
    }
    cursor.close();
}