Не удалось прочитать строку 1, столбец -1 из CursorWindow, который имеет 3 строки, 1 столбец

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();
        }
    }

}

Спасибо, что потратили время на просвещение людей. Этот сайт очень полезен для таких новичков, как я.

0
0
33
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Проблема в вашей проекции, второй аргумент query():

new String[] { ContactsContract.Data.LOOKUP_KEY}

Вы просите запрос вернуть только столбец LOOKUP_KEY. Поэтому, когда вы позже попытаетесь найти индексы столбцов для DISPLAY_NAME и NUMBER, getColumnIndex() вернет -1, поскольку не может найти эти столбцы. Исправьте это, изменив вашу проекцию на это:

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

Вы также можете избавиться от ContactsContract.Data.LOOKUP_KEY, если вы его нигде не используете.

я получаю два имени одного и того же контакта в списке массивов. Есть ли проблема с оставшимся кодом? Я не могу понять. Пожалуйста, объясни.

saikumar kolisetty 27.03.2018 19:43

@saikumarkolisetty Я ничего не вижу в этом коде. Если у вас есть отдельная проблема, задайте новый вопрос.

Michael Dodd 27.03.2018 20:00

Другие вопросы по теме