【发布时间】: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。这里发生了什么?