【问题标题】:Querying a search through all contacts通过所有联系人查询搜索
【发布时间】:2018-05-06 18:09:48
【问题描述】:

我正在尝试使用搜索查询来搜索联系人,但似乎有些问题:

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) {
    }
}

完整的联系人名单是 Amy、Kevin、John、Joe、Oscar。 如果我将“j”作为查询,我只会在光标中找到 John(即使我应该得到 John 和 Joe): D/Callbacks: Search Query: j John 如果我在查询中输入“a”,即使我应该得到 Amy,我也不会在光标中得到任何信息: D/Callbacks: Search Query: a

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

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

【问题讨论】:

  • cusor.getcount() 的大小是多少?
  • 嗯,搜索“a”时光标计数为 1,搜索“j”时光标计数为 3。这里发生了什么?

标签: java android


【解决方案1】:

首先,您将光标移动到调用方法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();
}

【讨论】:

  • 啊,就是这样。谢谢。
猜你喜欢
  • 1970-01-01
  • 2016-12-17
  • 1970-01-01
  • 2014-11-03
  • 1970-01-01
  • 1970-01-01
  • 2016-04-08
  • 1970-01-01
  • 2012-02-17
相关资源
最近更新 更多