簡體   English   中英

獲取 illegalargumentException:Android 中不存在列“data1”

[英]Getting illegalargumentException: column 'data1' does not exist in Android

我試圖在自定義 CursorAdapter 的幫助下將聯系人的姓名和電話號碼添加到我的自定義列表視圖中,但出現以下錯誤

例外

 11-07 17:53:39.619: ERROR/AndroidRuntime(628): FATAL EXCEPTION: main
 11-07 17:53:39.619: ERROR/AndroidRuntime(628): java.lang.IllegalArgumentException: column      'data1' does not exist
 11-07 17:53:39.619: ERROR/AndroidRuntime(628):     at android.database.AbstractCursor.getColumnIndexOrThrow(AbstractCursor.java:314)
 11-07 17:53:39.619: ERROR/AndroidRuntime(628):     at android.database.CursorWrapper.getColumnIndexOrThrow(CursorWrapper.java:99)
 11-07 17:53:39.619: ERROR/AndroidRuntime(628):     at org.com.apis.ContactListCustomCursorAdapter.bindView(ContactListCustomCursorAdapter.java:37)
 11-07 17:53:39.619: ERROR/AndroidRuntime(628):     at android.widget.CursorAdapter.getView(CursorAdapter.java:186)
 11-07 17:53:39.619: ERROR/AndroidRuntime(628):     at android.widget.AbsListView.obtainView(AbsListView.java:1315)
 11-07 17:53:39.619: ERROR/AndroidRuntime(628):     at android.widget.ListView.measureHeightOfChildren(ListView.java:1198)
 11-07 17:53:39.619: ERROR/AndroidRuntime(628):     at android.widget.ListView.onMeasure(ListView.java:1109)
 11-07 17:53:39.619: ERROR/AndroidRuntime(628):     at android.view.View.measure(View.java:8171)
 11-07 17:53:39.619: ERROR/AndroidRuntime(628):     at android.widget.RelativeLayout.measureChild(RelativeLayout.java:563)
 11-07 17:53:39.619: ERROR/AndroidRuntime(628):     at android.widget.RelativeLayout.onMeasure(RelativeLayout.java:378)
 11-07 17:53:39.619: ERROR/AndroidRuntime(628):     at android.view.View.measure(View.java:8171)
 11-07 17:53:39.619: ERROR/AndroidRuntime(628):     at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3132)
 11-07 17:53:39.619: ERROR/AndroidRuntime(628):     at android.widget.FrameLayout.onMeasure(FrameLayout.java:245)
 11-07 17:53:39.619: ERROR/AndroidRuntime(628):     at android.view.View.measure(View.java:8171)
 11-07 17:53:39.619: ERROR/AndroidRuntime(628):     at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3132)
 11-07 17:53:39.619: ERROR/AndroidRuntime(628):     at android.widget.FrameLayout.onMeasure(FrameLayout.java:245)
 11-07 17:53:39.619: ERROR/AndroidRuntime(628):     at android.view.View.measure(View.java:8171)
 11-07 17:53:39.619: ERROR/AndroidRuntime(628):     at android.view.ViewRoot.performTraversals(ViewRoot.java:801)
 11-07 17:53:39.619: ERROR/AndroidRuntime(628):     at android.view.ViewRoot.handleMessage(ViewRoot.java:1727)
 11-07 17:53:39.619: ERROR/AndroidRuntime(628):     at android.os.Handler.dispatchMessage(Handler.java:99)
 11-07 17:53:39.619: ERROR/AndroidRuntime(628):     at android.os.Looper.loop(Looper.java:123)
 11-07 17:53:39.619: ERROR/AndroidRuntime(628):     at android.app.ActivityThread.main(ActivityThread.java:4627)
 11-07 17:53:39.619: ERROR/AndroidRuntime(628):     at java.lang.reflect.Method.invokeNative(Native Method)
 11-07 17:53:39.619: ERROR/AndroidRuntime(628):     at java.lang.reflect.Method.invoke(Method.java:521)
 11-07 17:53:39.619: ERROR/AndroidRuntime(628):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
 11-07 17:53:39.619: ERROR/AndroidRuntime(628):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
 11-07 17:53:39.619: ERROR/AndroidRuntime(628):     at dalvik.system.NativeStart.main(Native Method)

這是我正在使用的代碼

主要活動代碼

 public class ManipulationActivity extends Activity {


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.contacts_list_layout);

    Cursor cursor = getCursor();


    ListView contactList = (ListView)findViewById(R.id.contactList);
    contactList.setAdapter(new ContactListCustomCursorAdapter(this, cursor)); //ContactListCustomCursorAdapter is a customized CursorAdapter. I have put the code below this class

}

    //Get Cursor pointing Contacts
private Cursor getCursor() {

    Cursor cursor = getContentResolver().query(ContactsContract.Contacts.CONTENT_URI,null, null, null, null); 
    while (cursor.moveToNext()) { 
       String contactId = cursor.getString(cursor.getColumnIndex( 
       ContactsContract.Contacts._ID)); 
       String hasPhone = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER)); 
       if (Boolean.parseBoolean(hasPhone)) { 
          // You know it has a number so now query it like this
          Cursor phones = getContentResolver().query( ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, ContactsContract.CommonDataKinds.Phone.CONTACT_ID +" = "+ contactId, null, null); 
          while (phones.moveToNext()) { 
             String phoneNumber = phones.getString(phones.getColumnIndex( ContactsContract.CommonDataKinds.Phone.NUMBER));                 
          } 
       phones.close(); 
       }
    }
    cursor.close();
    return cursor;
}      

}

ContactListCustomCursorAdapter代碼

public class ContactListCustomCursorAdapter extends CursorAdapter {

private Context context;
private Cursor cursor;
private LayoutInflater inflater;
private int username;
private int phoneNumber;

public ContactListCustomCursorAdapter(Context context, Cursor c) {
    super(context, c);
    this.context = context;
    this.cursor = c;
    inflater = LayoutInflater.from(context);

    username = cursor.getColumnIndexOrThrow(ContactsContract.Contacts.DISPLAY_NAME);
}

@Override
public void bindView(View view, Context context, Cursor cursor) {
    TextView userName = (TextView)view.findViewById(R.id.userName);
    userName.setText(cursor.getString(username));

    TextView phoneNumber = (TextView)view.findViewById(R.id.userNumber);
    phoneNumber.setText(cursor.getString(cursor.getColumnIndexOrThrow(ContactsContract.CommonDataKinds.Phone.NUMBER)));
}

@Override
public View newView(Context context, Cursor cursor, ViewGroup parent) {
    final View view = inflater.inflate(R.layout.custom_contact_list_item, parent, false);

    return view;
}

}

我不想使用聯系人選取器。

我花了幾個小時后也得到了這個錯誤。 存在CONSTANT COLUMN MISMATCH問題,“ data1”或NUMBER是屬於Phone類的常量。

聯系人合同。 聯系人 .CONTENT_URI不提供數字,因為您必須在查詢中提及投影,它將為您提供結果,借助此功能,您可以獲取._id,display_name。 但是,如果您想從id中獲取數字,則必須執行以下操作,

Cursor cursorPhone = getContentResolver().query(
                ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
                new String[]{ContactsContract.CommonDataKinds.Phone.NUMBER},
                ContactsContract.Contacts._ID +" = " + item_ID,
                null,
                null);

謝謝

val contactData=data..,data val c= contentResolver,query(contactData,,,null,null,null,null)

                if (c!!.moveToFirst()){

                    val id= c!!.getString(c!!.getColumnIndexOrThrow(ContactsContract.Contacts._ID))
                    val hasPhone= c!!.getString(c.getColumnIndexOrThrow(ContactsContract.Contacts.HAS_PHONE_NUMBER))

                    if (hasPhone.equals("1")){
                        //list of phones
                        val phones= contentResolver.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,null
                            , ContactsContract.CommonDataKinds.Phone.CONTACT_ID + "=" + id, null,null)

//我們將拿一部手機 phones...moveToFirst() val phoneNumber = phones.getString(phones.getColumnIndexOrThrow(ContactsContract.CommonDataKinds.Phone.NUMBER)) val name = c.getString(c.getColumnIndexOrThrow(ContactsContract.Contacts.DISPLAY_NAME ))

首先,將關閉傳遞給CursorAdapter的游標。 如果將游標分配給適配器,則不應關閉它,只需在onDestroy中為您的活動調用changeCursor(null)。

其次,從代碼中,我假設您想顯示所有聯系人及其電話號碼的列表,因此您的getCursor方法應類似於以下內容

private Cursor getCursor() {

    Cursor cursor = getContentResolver().query( ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, null, null, null); 

    return cursor;
}

而且您的bindView應該像

@Override
public void bindView(View view, Context context, Cursor cursor) {
    TextView userName = (TextView)view.findViewById(R.id.userName);
    userName.setText(cursor.getString(cursor.getColumnIndexOrThrow(ContactsContract.Contacts.DISPLAY_NAME)));

    TextView phoneNumber = (TextView)view.findViewById(R.id.userNumber);
    phoneNumber.setText(cursor.getString(cursor.getColumnIndexOrThrow(ContactsContract.CommonDataKinds.Phone.NUMBER)));
}

我已通過確保在需要時打開數據庫而在不需要時關閉了數據庫來解決了該問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM