2014-02-07 30 views
0

你好我試圖通過ContentProvider的擺脫聯繫人表的數據,但它崩潰每次當我開始我的應用程序,字段槽0,-1的錯誤請求。 numRows行= 164,爲numColumns = 63

這裏是我的源代碼:

public class WebpreneurActivity extends ListActivity { 



     private DBHandler dbHelper; 

      private Cursor phones; 
      ImageButton imageButton; 
      public static long rowId; 
      @Override 
      protected void onCreate(Bundle savedInstanceState) { 
       Log.d("database1" ,"0"); 
       Log.d("Your Location4", "ok4:"); 
       super.onCreate(savedInstanceState); 
       Log.d("database1" ,"1"); 
       setContentView(R.layout.activity_webpreneur); 
       Log.d("database1" ,"2"); 
       //dbHelper = new DBHandler(this); 
       Log.d("database1" ,"3"); 
      // dbHelper.open(); 
        phones = getContentResolver().query(
          ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, 
          ContactsContract.Contacts._ID, null, 
          ContactsContract.Contacts.DISPLAY_NAME + " ASC"); 
        if (phones.getCount() > 0) { 
         while (phones.moveToFirst()) { 

          if (Integer.parseInt(phones.getString(phones 
              .getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER))) > 0) { 


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

            String phoneNumber = phones 
              .getString(phones 
                .getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)); 
            String contactId = phones 
              .getString(phones 
                .getColumnIndex(ContactsContract.CommonDataKinds.Phone.CONTACT_ID)); 
            System.out.println("contactId="+ contactId+ ", name=" + name + ", phoneNumber=" + phoneNumber); 

          } 

         } 
         phones.close(); 

        }}} 

而且我logcat的是:

02-07 17:00:54.905: D/database1(19505): 0 
02-07 17:00:54.905: D/Your Location4(19505): ok4: 
02-07 17:00:54.905: D/database1(19505): 1 
02-07 17:00:54.985: D/database1(19505): 2 
02-07 17:00:54.985: D/database1(19505): 3 
02-07 17:00:55.045: E/CursorWindow(19505): Bad request for field slot 0,-1. numRows = 164, numColumns = 63 
02-07 17:00:55.045: D/AndroidRuntime(19505): Shutting down VM 
02-07 17:00:55.045: W/dalvikvm(19505): threadid=1: thread exiting with uncaught exception (group=0x4001d578) 
02-07 17:00:55.085: E/AndroidRuntime(19505): FATAL EXCEPTION: main 
02-07 17:00:55.085: E/AndroidRuntime(19505): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.webpreneur_contactlist/com.webpreneur_contactlist.WebpreneurActivity}: java.lang.IllegalStateException: get field slot from row 0 col -1 failed 
02-07 17:00:55.085: E/AndroidRuntime(19505): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1659) 
02-07 17:00:55.085: E/AndroidRuntime(19505): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1675) 
02-07 17:00:55.085: E/AndroidRuntime(19505): at android.app.ActivityThread.access$1500(ActivityThread.java:121) 
02-07 17:00:55.085: E/AndroidRuntime(19505): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:943) 
02-07 17:00:55.085: E/AndroidRuntime(19505): at android.os.Handler.dispatchMessage(Handler.java:99) 
02-07 17:00:55.085: E/AndroidRuntime(19505): at android.os.Looper.loop(Looper.java:138) 
02-07 17:00:55.085: E/AndroidRuntime(19505): at android.app.ActivityThread.main(ActivityThread.java:3701) 
02-07 17:00:55.085: E/AndroidRuntime(19505): at java.lang.reflect.Method.invokeNative(Native Method) 
02-07 17:00:55.085: E/AndroidRuntime(19505): at java.lang.reflect.Method.invoke(Method.java:507) 
02-07 17:00:55.085: E/AndroidRuntime(19505): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:878) 
02-07 17:00:55.085: E/AndroidRuntime(19505): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:636) 
02-07 17:00:55.085: E/AndroidRuntime(19505): at dalvik.system.NativeStart.main(Native Method) 
02-07 17:00:55.085: E/AndroidRuntime(19505): Caused by: java.lang.IllegalStateException: get field slot from row 0 col -1 failed 
02-07 17:00:55.085: E/AndroidRuntime(19505): at android.database.CursorWindow.getString_native(Native Method) 
02-07 17:00:55.085: E/AndroidRuntime(19505): at android.database.CursorWindow.getString(CursorWindow.java:329) 
02-07 17:00:55.085: E/AndroidRuntime(19505): at android.database.AbstractWindowedCursor.getString(AbstractWindowedCursor.java:49) 
02-07 17:00:55.085: E/AndroidRuntime(19505): at android.database.CursorWrapper.getString(CursorWrapper.java:135) 
02-07 17:00:55.085: E/AndroidRuntime(19505): at com.webpreneur_contactlist.WebpreneurActivity.onCreate(WebpreneurActivity.java:58) 
02-07 17:00:55.085: E/AndroidRuntime(19505): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047) 
02-07 17:00:55.085: E/AndroidRuntime(19505): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1623) 
02-07 17:00:55.085: E/AndroidRuntime(19505): ... 11 more 
02-07 17:04:53.027: I/Process(19505): Sending signal. PID: 19505 SIG: 9 
+0

,爲什麼你遍歷返回遊標? – pskink

+0

我嘗試了不同的代碼從聯繫人表中獲取數據,這是我從堆棧溢出複製的代碼之一,因爲我自己的代碼無法獲得結果,請您幫助我解決此問題,因爲我卡在這個。 – Shazar

+0

再次:爲什麼你迭代返回的遊標? – pskink

回答

2

只要不傳遞到ContactsContract.Contacts._ID要求query()

phones = getContentResolver().query(
          ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, 
          null, null, 
          ContactsContract.Contacts.DISPLAY_NAME + " ASC"); 

更新: 其實有在你的代碼

了其他幾個問題中有ContactsContract.CommonDataKinds.Phone表中沒有ContactsContract.Contacts.HAS_PHONE_NUMBER列。你應該只需要ContactsContract.CommonDataKinds.Phone.NUMBER並檢查它是否不是空的。

而且你應該使用的while (phones.moveToNext())代替while (phones.moveToFirst())

請試試這個代碼:

phones = getContentResolver().query(
      ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, 
      null, null, 
      ContactsContract.Contacts.DISPLAY_NAME + " ASC"); 
    if (phones.getCount() > 0) { 
     while (phones.moveToNext()) { 

      String phoneNumber = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)); 
      if (!TextUtils.isEmpty(phoneNumber)) { 


        String name = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME)); 
        String contactId = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.CONTACT_ID)); 
        System.out.println("contactId="+ contactId+ ", name=" + name + ", phoneNumber=" + phoneNumber); 

      } 

     } 
+0

再次得到相同的錯誤先生。 – Shazar

+0

看看更新 – birdy

+0

嗯,你其實岩石先生你是非常認真的非常感謝你,謝謝你這麼多.. – Shazar