2012-02-23 50 views
0

我想要顯示的聯繫人姓名和它在以這種方式複選框電話號碼顯示聯繫人和電話號碼:「聯繫人姓名:電話號碼」 但我發現這個錯誤的logcat的"java.lang.IllegalArgumentException: Invalid column data1"複選框中

這裏是我----->

package wael.ilahi.pfe; 


import java.util.ArrayList; 
import java.util.HashMap; 
import java.util.zip.Inflater; 

import android.app.Activity; 
import android.app.ListActivity; 
import android.content.Intent; 
import android.database.Cursor; 
import android.net.Uri; 
import android.os.Bundle; 
import android.provider.ContactsContract; 
import android.util.Log; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.view.ViewGroup; 
import android.view.Window; 
import android.view.WindowManager; 
import android.widget.AdapterView; 
... 


public class SelectFriends extends Activity implements OnClickListener { 
    public static final String TAG = "ContactManager"; 
    private Button bSave; 
    private ListView lv; 
    private boolean mShowInvisible; 
    CheckBox ch; 
    String s; 
    int k=0; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     // TODO Auto-generated method stub 
     Log.v(TAG, "Activity State: onCreate()"); 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main1); 
     bSave = (Button) findViewById(R.id.addContactButton); 
     lv = (ListView) findViewById(R.id.contactList); 
     populateContactList(); 

     lv.setOnItemClickListener(new OnItemClickListener() { 
      @Override 
      public void onItemClick(AdapterView<?> parent, View view,final     
       int position, long id) { 
      ch = (CheckBox) view.findViewById(R.id.checkBox); 
      ch.setOnCheckedChangeListener(new OnCheckedChangeListener() { 

       @Override 
       public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
        // TODO Auto-generated method stub 
        Toast.makeText(getApplicationContext(), 
         "Click ListItem Number " + position, Toast.LENGTH_LONG).show(); 
        } 
       });  
      } 
     }); 

     bSave.setOnClickListener(this); 
    } 

    private void populateContactList() { 
     // Build adapter with contact entries 
     Cursor cursor = getContacts(); 
     String[] fields = new String[] { 
      ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME +":"+ 
      ContactsContract.CommonDataKinds.Phone.NUMBER}; 

     SimpleCursorAdapter adapter = new SimpleCursorAdapter(this, 
     R.layout.contact_entry, cursor,fields, new int[] {R.id.checkBox}); 
     lv.setAdapter(adapter); 
    } 

    private Cursor getContacts(){ 
     // Run query 
     Uri uri = ContactsContract.Contacts.CONTENT_URI; 
     String[] projection = new String[] { 

      //ContactsContract.Contacts.DISPLAY_NAME, 
      ContactsContract.CommonDataKinds.Phone.NUMBER }; 
     String selection = null; 
     String[] selectionArgs = null; 
     String sortOrder =null; 

     return managedQuery(uri, projection, selection, selectionArgs, sortOrder); 
    } 

    @Override 
    public void onClick(View arg0) { 
     // TODO Auto-generated method stub 
    } 
} 
+0

將完整的StackTrace添加到您的問題。 – 2012-02-23 21:48:48

回答

1

它看起來像你想查詢聯繫人表並從它返回一個電話號碼,工作代碼。

不幸的是,這不是聯繫人提供程序的工作方式。總結: 聯繫人提供程序有三個表:聯繫人,RawContacts和數據。每個聯繫人行 指向一個或多個RawContacts行。每個RawContact行都指向一個或多個數據行。

人們作爲原始聯繫人存儲在聯繫人提供程序中。供應商自己創建 聯繫人行。自動選擇一個原始聯繫人姓名作爲聯繫人行的DISPLAY_NAME_PRIMARY。

數據表包含原始聯繫人的詳細信息。行是通用的。他們每個人都有相同的列名,你可以在ContactsContract.Data中看到。要選擇特定類型的詳細信息(例如電話號碼),必須搜索MIME類型爲ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE的Data行。然後,您可以將該行中的電話號碼稱爲 ContactsContract.CommonDataKinds.Phone.PHONE_NUMBER;這個常量的值是 「data1」。也就是說,CommonDataKinds類中的常量是ContactsContract.Data中定義的名稱爲 DATA1-DATA15的別名。別名使得理解數據行的語義更容易。

有一個簡單的方法可以實現您的目標:使用ContactsContract.Contacts.Entity構造。這將返回一個包含Contact的所有Data和RawContacts行的Cursor。如果將選擇參數設置爲ContactsContract.Data.MIME_TYPE = ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE,則只能檢索電話號碼。

注意:原始聯繫人的顯示名稱作爲 ContactsContract.CommonDataKinds.StructuredName行存儲在數據表中。

+0

我剛試過這段代碼,在列表視圖中的一個複選框中顯示電話號碼 – 2012-02-24 00:15:44