Android SmsManager отправляет сообщение нескольким получателям из базы данных sqlite

Я новичок на Android, пожалуйста, помогите мне в моей проблеме. Я хочу отправить сообщение на несколько номеров. Числа сохраняются в базе данных SQLite. Я хочу отправить сообщение на все номера, сохраненные в таблице базы данных.

Вот мой код, пока он отправляет смс только на один номер в моей базе данных. Это только отправить на первый номер в моей таблице.

private void sendSMS(String message) {
    if(ContextCompat.checkSelfPermission(this, Manifest.permission.READ_PHONE_STATE)
            != PackageManager.PERMISSION_GRANTED && ContextCompat.checkSelfPermission(this, Manifest.permission.SEND_SMS)
            != PackageManager.PERMISSION_GRANTED){
        ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_PHONE_STATE, Manifest.permission.SEND_SMS},
                MY_PERMISSION_REQUEST_SEND_SMS);
    }else{
        SmsManager sms = SmsManager.getDefault();
        SQLiteDatabase db = myDB.getWritableDatabase();
        Cursor res = db.rawQuery("select * from recipients_tbl", null);
        if(res != null && res.moveToFirst()) {
            String num = res.getString(1);
            sms.sendTextMessage(num, null, message, sentPI, deliveredPI);
        }
    }
}

3 ответа

Причина, по которой он отправляется только на первый номер, заключается в том, что вы не просматриваете свой результат. Для того, чтобы он работал, вам нужно написать свой код следующим образом:

if(res != null){
    for(res.moveToFirst(); !res.isAfterLast(); res.moveToNext())
    {
        String num = res.getString(1);
        sms.sendTextMessage(num, null, message, sentPI, deliveredPI);
    }
}

Первым делом поменяйте:

SQLiteDatabase db = myDB.getWritableDatabase();

чтобы:

SQLiteDatabase db = myDB.getReadableDatabase();

Потому что вы не пишете в базу данных.

Затем вам нужно выполнить итерацию по каждой строке:

while(res.moveToNext())
{
    String num = res.getString(1);
    sms.sendTextMessage(num, null, message, sentPI, deliveredPI);
}
res.close();

Вы знаете, курсор указывает на первый ряд, и вы должны перевести этот курсор в следующий ряд moveToNext(), И, наконец, не забудьте закрыть Cursor,

FYK: Какой лучший способ перебора курсора Android?

Все, что вам нужно сделать, это перебрать курсор, например

private void sendSMS(String message) {
    if(ContextCompat.checkSelfPermission(this, Manifest.permission.READ_PHONE_STATE)
            != PackageManager.PERMISSION_GRANTED && ContextCompat.checkSelfPermission(this, Manifest.permission.SEND_SMS)
            != PackageManager.PERMISSION_GRANTED){
        ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_PHONE_STATE, Manifest.permission.SEND_SMS},
                MY_PERMISSION_REQUEST_SEND_SMS);
    }else{
        SmsManager sms = SmsManager.getDefault();
        SQLiteDatabase db = myDB.getWritableDatabase();
        Cursor res = db.rawQuery("select * from recipients_tbl", null);
        while (res.moveToNext()) {  //<<<<<<<<<< CHANGED
            String num = res.getString(1);
            sms.sendTextMessage(num, null, message, sentPI, deliveredPI);
        }
        res.close();
    }
}
  • Обратите внимание, что проверка курсора, возвращенного из метода SQLiteDatabase, такого как query или rawQuery, бесполезна, так как будет возвращен действительный курсор. Если у курсора нет строк, то он будет пустым (метод getCount вернет 0). В качестве таких if(res.moveToFirst()) ..... лучше, чем if(res != null && res.moveToFirst()) .....,
Другие вопросы по тегам