无法从具有 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_NAME
和 NUMBER
的列索引时,getColumnIndex()
returns -1 因为它找不到这些列。通过将投影更改为此来解决此问题:
new String[] {
ContactsContract.Data.LOOKUP_KEY,
ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME,
ContactsContract.CommonDataKinds.Phone.NUMBER
}
如果您不在任何地方使用它,您也可以删除 ContactsContract.Data.LOOKUP_KEY
。
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_NAME
和 NUMBER
的列索引时,getColumnIndex()
returns -1 因为它找不到这些列。通过将投影更改为此来解决此问题:
new String[] {
ContactsContract.Data.LOOKUP_KEY,
ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME,
ContactsContract.CommonDataKinds.Phone.NUMBER
}
如果您不在任何地方使用它,您也可以删除 ContactsContract.Data.LOOKUP_KEY
。