我正在尝试使用搜索查询搜索联系人,但某些内容似乎无法正常工作:
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看起来我做的一切都是正确的。
答案 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();
}