Android 查询如何返回零大小的游标-它应该为空

Android 查询如何返回零大小的游标-它应该为空,android,android-cursor,android-contentresolver,Android,Android Cursor,Android Contentresolver,我有一个函数,它接受一个电话号码,并使用安卓提供商查找其名称 通常工作正常,但有时会出现错误: CursorIndexOutOfBoundsException:请求索引0,大小为0 这让我感到奇怪,因为我在尝试操作光标之前检查它是否为null,据我所知,如果没有找到结果,它应该返回null 完整的错误日志: 03-09 19:47:20.115: E/AndroidRuntime(12976): FATAL EXCEPTION: main 03-09 19:47:20.115: E/Androi

我有一个函数,它接受一个电话号码,并使用安卓提供商查找其名称

通常工作正常,但有时会出现错误:

CursorIndexOutOfBoundsException:请求索引0,大小为0

这让我感到奇怪,因为我在尝试操作光标之前检查它是否为null,据我所知,如果没有找到结果,它应该返回null

完整的错误日志:

03-09 19:47:20.115: E/AndroidRuntime(12976): FATAL EXCEPTION: main
03-09 19:47:20.115: E/AndroidRuntime(12976): java.lang.RuntimeException: Unable to start service com.abg.a.ServiceFloatingButton@405469a0 with Intent { cmp=com.abg.a/.ServiceFloatingButton (has extras) }: android.database.CursorIndexOutOfBoundsException: Index 0 requested, with a size of 0
03-09 19:47:20.115: E/AndroidRuntime(12976):    at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:2056)
03-09 19:47:20.115: E/AndroidRuntime(12976):    at android.app.ActivityThread.access$2800(ActivityThread.java:117)
03-09 19:47:20.115: E/AndroidRuntime(12976):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:998)
03-09 19:47:20.115: E/AndroidRuntime(12976):    at android.os.Handler.dispatchMessage(Handler.java:99)
03-09 19:47:20.115: E/AndroidRuntime(12976):    at android.os.Looper.loop(Looper.java:123)
03-09 19:47:20.115: E/AndroidRuntime(12976):    at android.app.ActivityThread.main(ActivityThread.java:3691)
03-09 19:47:20.115: E/AndroidRuntime(12976):    at java.lang.reflect.Method.invokeNative(Native Method)
03-09 19:47:20.115: E/AndroidRuntime(12976):    at java.lang.reflect.Method.invoke(Method.java:507)
03-09 19:47:20.115: E/AndroidRuntime(12976):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:847)
03-09 19:47:20.115: E/AndroidRuntime(12976):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:605)
03-09 19:47:20.115: E/AndroidRuntime(12976):    at dalvik.system.NativeStart.main(Native Method)
03-09 19:47:20.115: E/AndroidRuntime(12976): Caused by: android.database.CursorIndexOutOfBoundsException: Index 0 requested, with a size of 0
03-09 19:47:20.115: E/AndroidRuntime(12976):    at android.database.AbstractCursor.checkPosition(AbstractCursor.java:580)
03-09 19:47:20.115: E/AndroidRuntime(12976):    at android.database.AbstractWindowedCursor.checkPosition(AbstractWindowedCursor.java:214)
03-09 19:47:20.115: E/AndroidRuntime(12976):    at android.database.AbstractWindowedCursor.getString(AbstractWindowedCursor.java:41)
03-09 19:47:20.115: E/AndroidRuntime(12976):    at android.database.CursorWrapper.getString(CursorWrapper.java:135)
03-09 19:47:20.115: E/AndroidRuntime(12976):    at com.abg.a.Contact.getInstanceFromPhoneBook(Contact.java:481)
03-09 19:47:20.115: E/AndroidRuntime(12976):    at com.abg.a.ServiceFloatingButton.getContactFromCall(ServiceFloatingButton.java:181)
03-09 19:47:20.115: E/AndroidRuntime(12976):    at com.abg.a.ServiceFloatingButton.onStartCommand(ServiceFloatingButton.java:48)
03-09 19:47:20.115: E/AndroidRuntime(12976):    at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:2043)
03-09 19:47:20.115: E/AndroidRuntime(12976):    ... 10 more
职能:

public static Contact getInstanceFromPhoneBook(String phoneNumber,ContentResolver resolver) 
    {
        //TODO get the email, and a real priority
        Uri uri = Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI, Uri.encode(phoneNumber));
        String column[]=new String[]{PhoneLookup.DISPLAY_NAME};
        Cursor cursor=resolver.query(uri, column,null,null,null);
        Contact contact=null;
        if (cursor!=null)
        {
            cursor.moveToFirst();
            String name=cursor.getString(cursor.getColumnIndex(PhoneLookup.DISPLAY_NAME));
            String email="";
            int priority=1;
            contact=new Contact(name,"", phoneNumber, email,priority);  
        }

        return contact;
    }

任何人都可以解释问题的根源吗?

像这样编辑代码,然后重试:

try {
       if (cursor!=null && cursor.moveToFirst())
            {
                cursor.moveToFirst();
                String name=cursor.getString(cursor.getColumnIndex(PhoneLookup.DISPLAY_NAME));
                String email="";
                int priority=1;
                contact=new Contact(name,"", phoneNumber, email,priority);  
            }
    else{
     contact=new Contact(null,null, null, null,null);  
    }
finally {

            cursor.close();
        }
db.close();
            return contact; 

我也遇到了同样的错误,这段代码对我来说也很有用。

嗨,我知道我可以在if语句中添加一个检查,但我的问题是为什么会发生这种情况,游标如何返回并且大小为0?实际上我也不知道。