Android 光标错误 - 确保光标已正确初始化

Posted

技术标签:

【中文标题】Android 光标错误 - 确保光标已正确初始化【英文标题】:Android Cursor error - Make sure cursor is initialised correctly 【发布时间】:2016-07-28 03:34:31 【问题描述】:

我已经设置了一个光标,我想返回一个有电话号码的联系人的列表视图。因此,在每个单元格中,我都会在下方显示联系人姓名和电话号码。这段代码主要完成了这项工作:

// this query only return contacts with phone number and is not duplicated
        phones = getContentResolver().query(
                ContactsContract.Contacts.CONTENT_URI,
                null,
//                we only want contacts that have a name and a phone number. If they have a phone number, the value is 1 (if not, it is 0)
                ContactsContract.Contacts.IN_VISIBLE_GROUP + " = '" + ("1") + "'" + " AND " + ContactsContract.Contacts.HAS_PHONE_NUMBER + "=1",
                null,
                ContactsContract.Contacts.DISPLAY_NAME + " COLLATE LOCALIZED ASC");

然后在提取信息并将其放入每个单元格时:

        while (phones.moveToNext()) 

            String name = phones.getString(phones.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
            String phoneNumber = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));

我收到一个错误,部分代码是:

04-07 10:43:46.489  17742-17760/com.example.chris.contactlistcustomlistview E/CursorWindow﹕ Failed to read row 0, column -1 from a CursorWindow which has 134 rows, 34 columns.
04-07 10:43:46.489  17742-17760/com.example.chris.contactlistcustomlistview W/dalvikvm﹕ threadid=11: thread exiting with uncaught exception (group=0x416168e0)
04-07 10:43:46.489  17742-17760/com.example.chris.contactlistcustomlistview E/androidRuntime﹕ FATAL EXCEPTION: AsyncTask #1
    java.lang.RuntimeException: An error occured while executing doInBackground()
            at android.os.AsyncTask$3.done(AsyncTask.java:299)
            at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:352)
            at java.util.concurrent.FutureTask.setException(FutureTask.java:219)
            at java.util.concurrent.FutureTask.run(FutureTask.java:239)
            at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
            at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080)
            at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573)
            at java.lang.Thread.run(Thread.java:841)
     Caused by: java.lang.IllegalStateException: Couldn't read row 0, col -1 from CursorWindow.  Make sure the Cursor is initialized correctly before accessing data from it.
            at android.database.CursorWindow.nativeGetString(Native Method)

所以,光标从Contacts.Contracts 跳到ContactsContract.CommonDataKinds.Phone,它不喜欢它。但是我还能如何获取用户的电话号码?据我所知,它不在ContactsContracts.Contacts 中。在转到CommonDataKinds 之前我应该​​重新初始化光标还是什么?我该怎么做?

【问题讨论】:

【参考方案1】:

您是否尝试过在phones.moveToNext() 之前调用phones.moveToFirst()?它移动到第一行。这是因为您当前的查询返回一个位于第一个条目之前的 Cursor 对象。

你可以试试写:

if (phones.moveToFirst()) 

       while (phones.moveToNext()) 
                    // etc

【讨论】:

感谢 PlanetAstro,但这并没有解决问题。还是一样的错误。我相信 movetonext 和 movetofirst 从表格中的第一个位置开始时无论如何都会做同样的事情。【参考方案2】:
if (phones != null) 
    phones.moveToFirst();

【讨论】:

以上是关于Android 光标错误 - 确保光标已正确初始化的主要内容,如果未能解决你的问题,请参考以下文章

我的应用程序不断崩溃,光标未正确初始化

如何在android中正确关闭光标

Flutter:使用初始值文本时如何隐藏TextField文本指针(光标)(Android)

android光标未关闭错误

PLSQL“错误光标已打开”

Perl OLE32 MSSQL dateadd 函数结果上的“光标类型已更改”错误