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
,
Все, что вам нужно сделать, это перебрать курсор, например
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()) .....
,