Java 在所有联系人中查询搜索
我正在尝试使用搜索查询搜索联系人,但某些内容似乎不起作用:Java 在所有联系人中查询搜索,java,android,Java,Android,我正在尝试使用搜索查询搜索联系人,但某些内容似乎不起作用: 公共类回调实现LoaderManager.LoaderCallbacks{ 语境; 字符串查询; 公共静态最终字符串查询\u KEY=“QUERY”; 公共静态最终字符串TAG=“Callbacks”; 公共回调(上下文){mContext=Context;} @凌驾 公共加载器onCreateLoader(int-loaderIndex,Bundle-args){ query=args.getString(查询键); ContentR
公共类回调实现LoaderManager.LoaderCallbacks{
语境;
字符串查询;
公共静态最终字符串查询\u KEY=“QUERY”;
公共静态最终字符串TAG=“Callbacks”;
公共回调(上下文){mContext=Context;}
@凌驾
公共加载器onCreateLoader(int-loaderIndex,Bundle-args){
query=args.getString(查询键);
ContentResolver cr=mContext.getContentResolver();
Uri contentUri=Uri.withAppendedPath(ContactsContract.Contacts.CONTENT\u FILTER\u Uri,Uri.encode(query));
Uri fullContentUri=ContactsContract.Contacts.CONTENT\u Uri;
返回新游标装入器(
mContext,//上下文
contentUri,//搜索这个
null,//投影
null,//选择
null,//选择参数
空//排序顺序
);
}
@凌驾
public void onLoadFinished(加载器arg0,光标){
if(cursor.getCount()==0)返回;
cursor.moveToFirst();
Log.d(标记“搜索查询:”+Query);
while(cursor.moveToNext()){
String displayName=cursor.getString(cursor.getColumnIndex(ContactsContract.Data.DISPLAY_NAME));
Log.d(标签、显示名称);
}
cursor.close();
}
@凌驾
public void onLoaderReset(加载器游标加载器){
}
}
完整的联系人名单是艾米、凯文、约翰、乔、奥斯卡。
如果我把“j”作为查询,我只在光标中得到John(即使我应该得到John和Joe):
D/回调:搜索查询:j
约翰
如果我在查询中输入“a”,则光标中没有任何内容,即使我应该得到:
D/回调:搜索查询:a
如果我将contentUri替换为fullContentUri(在gist中定义),这样它就不是经过筛选的uri,那么无论查询是什么,我都会按预期获得所有联系人:
D/回调:搜索查询:j
艾米
凯文
乔
D/回拨:奥斯卡
约翰
因此,我的筛选有点不对劲……但根据这一点:看起来我做的一切都是对的。首先,您将光标移动到调用方法的第一个项目
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();
}
@覆盖
public void onLoadFinished(加载器arg0,光标){
if(cursor.getCount()==0)返回;
Log.d(标记“搜索查询:”+Query);
while(cursor.moveToNext()){
String displayName=cursor.getString(cursor.getColumnIndex(ContactsContract.Data.DISPLAY_NAME));
Log.d(标签、显示名称);
}
cursor.close();
}
首先,将光标移动到调用方法的第一个项目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();
}
@覆盖
public void onLoadFinished(加载器arg0,光标){
if(cursor.getCount()==0)返回;
Log.d(标记“搜索查询:”+Query);
while(cursor.moveToNext()){
String displayName=cursor.getString(cursor.getColumnIndex(ContactsContract.Data.DISPLAY_NAME));
Log.d(标签、显示名称);
}
cursor.close();
}
cusor.getcount()的大小是多少?搜索“a”时,光标计数为1,搜索“j”时,光标计数为3。这里发生了什么?cusor.getcount()的大小是多少?搜索“a”时,光标计数是1,搜索“j”时,光标计数是3。这里发生了什么事?啊,就是这样。谢谢。啊,就是这样。非常感谢。