无法从具有 3 行 1 列的 CursorWindow 读取第 1 行第 -1 列

Failed to read row 1, column -1 from a CursorWindow which has 3 rows, 1 columns

Cursor c=getContentResolver().query(ContactsContract.Data.CONTENT_URI, new String[] { ContactsContract.Data.LOOKUP_KEY}, null,null, null);
    contacts=new ArrayList<String>();
    phno=new ArrayList<String>();
    c.moveToFirst();
    while (c.moveToNext()) {
        String contactname = c.getString(c.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
        String phnumber= c.getString(c.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
        contacts.add(contactname);//adding in array list
        phno.add(phnumber);//adding in array list
    }
    c.close();

请帮我解决这个错误,我知道如果列号是 -1 则没有列。我该如何解决这个问题?

这里是代码,其他都是初始化。

 protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_receive);
    actv = (AutoCompleteTextView) findViewById(R.id.autoCompleteTextView);
    int permissioncheck = ContextCompat.checkSelfPermission(Receive.this, Manifest.permission.READ_CONTACTS);
    if (permissioncheck == PackageManager.PERMISSION_GRANTED) {
        showContacts();
    }
    else {
        ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_CONTACTS}, PERMISSIONS_REQUEST_READ_CONTACTS);
    }
    ArrayAdapter<String> adapter=new ArrayAdapter<String>(Receive.this,android.R.layout.simple_list_item_1,contacts);
    actv.setAdapter(adapter);
    b1=(Button)findViewById(R.id.button);
    tv=(TextView)findViewById(R.id.textView3);
    b1.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            x=actv.getListSelection();
            phone=phno.get(x).toString();
            tv.setText(phone);
        }
    });
}
public void onRequestPermissionsResult(int requestCode,String[] permissions,int[] grantResults){
    if(requestCode==PERMISSIONS_REQUEST_READ_CONTACTS){
        if(grantResults[0]==PackageManager.PERMISSION_GRANTED){
            showContacts();
        }else{
            Toast.makeText(this,"permission granted",Toast.LENGTH_LONG).show();
        }
    }

}

感谢您花时间教育人们。这个网站对我这样的菜鸟很有帮助

问题出在你的投影上,query() 的第二个参数:

new String[] { ContactsContract.Data.LOOKUP_KEY}

您要求查询仅 return LOOKUP_KEY 列。因此,当您稍后尝试查找 DISPLAY_NAMENUMBER 的列索引时,getColumnIndex() returns -1 因为它找不到这些列。通过将投影更改为此来解决此问题:

new String[] { 
        ContactsContract.Data.LOOKUP_KEY,
        ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME,
        ContactsContract.CommonDataKinds.Phone.NUMBER
}

如果您不在任何地方使用它,您也可以删除 ContactsContract.Data.LOOKUP_KEY