0

に存在していない私は、カスタムCursorAdapterの助けを借りて、私のカスタマイズされたリストビューに連絡先から名前と電話番号を入れしようとしています、しかし、私は次のようなエラーにはIllegalArgumentExceptionを取得:列「DATA1は」Androidの

例外を取得していますここで

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) 

は私が

主な活動コード

を使用していますコードです3210
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; 
} 

} 

私は連絡先ピッカーを使用する必要はありません。

答えて

0

まず、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))); 
} 
+0

ありがとう持ちます答えが機能していません... – Nik

+0

CursorAdapterを使用していない場合、CursorAdapterから拡張する理由を説明できますか? – iago

0

私は、データベースが必要なときに開かれていることを確認し、そうでないときは閉じていることで問題を解決しました。

1

私もこのエラーがありました。数時間を過ごした後、私は答えを得ました。 CONSTANT COLUMN MISMATCHの問題があります。 'data1'またはNUMBERは、クラスに属する定数です。

ContactsContract。 連絡先 .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); 

が、私は任意のカーソルアダプターを使用しても、任意の連絡先や電話番号にアクセスする...ので、あなたではないのです

関連する問題