2016-04-07 6 views
0

Ich habe einen Cursor eingerichtet, der eine Liste von Kontakten zurückgeben soll, die eine Telefonnummer haben. In jeder Zelle habe ich den Kontaktnamen und dann die Telefonnummer darunter. Dieser Code meist macht den Job:Android Cursor Fehler - Stellen Sie sicher, dass der Cursor korrekt initialisiert wird

// 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"); 

Und dann, wenn es darum geht, Informationen zu extrahieren und sie in jeder Zelle setzen:

 while (phones.moveToNext()) { 

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

Ich erhalte einen Fehler, einen Teil des Codes, der lautet:

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) 

So wird der Cursor Contacts.Contracts-ContactsContract.CommonDataKinds.Phone Hopping und es mag es nicht. Aber wie kann ich sonst die Telefonnummer eines Benutzers bekommen? Soweit ich weiß, ist es nicht in ContactsContracts.Contacts. Sollte ich den Cursor oder etwas vor dem Gehen zu CommonDataKinds reinitialisieren und wie würde ich das tun?

Antwort

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

Haben Sie versucht, phones.moveToFirst() vor phones.moveToNext() anzurufen? Es bewegt sich in die erste Reihe. Dies liegt daran, dass Ihre aktuelle Abfrage ein Cursor-Objekt zurückgibt, das vor dem ersten Eintrag positioniert ist.

Sie können schriftlich versuchen:

if (phones.moveToFirst()) { 

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

dank PlanetAstro, aber das hat nicht zu beheben. Immer noch derselbe Fehler. Ich glaube, dass movetonext und movetofirst das gleiche tun, wenn man von der ersten Position in einer Tabelle ausgeht. – CHarris