2016-04-07 16 views
0

電話番号の連絡先のリストビューを返すカーソルを設定しました。したがって、各セルには、連絡先の名前と電話番号が下に表示されます。Androidカーソルエラー - カーソルが正しく初期化されていることを確認してください

// 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に行く前にカーソルなどを再初期化する必要がありますが、どうすればよいですか?

答えて

0
if (phones != null) { 
    phones.moveToFirst(); 
} 
1

phones.moveToFirst()をphones.moveToNext()の前に呼び出そうとしましたか?最初の行に移動します。これは、現在のクエリが最初のエントリの前に配置されたCursorオブジェクトを返すためです。 PlanetAstro

if (phones.moveToFirst()) { 

     while (phones.moveToNext()) { 
        // etc 
+0

おかげで、それはそれを修正しませんでした:

あなたは書き込みを試すことができます。まだ同じエラー。私はmovetonextとmovetofirstはとにかく、テーブルの最初の位置から開始すると同じことを行うと信じています。 – CHarris