Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/376.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在所有联系人中查询搜索_Java_Android - Fatal编程技术网

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。这里发生了什么事?啊,就是这样。谢谢。啊,就是这样。非常感谢。