2016-07-20 2 views
-1

Я разрабатываю приложение sms. Когда sms получен, он сохраняется в sqlite db и отображается в списке как элемент listview. Теперь проблема заключается в том, что «если 4 сообщения получены от номера, он говорит« 090071222 », а затем каждый раз, когда sms сохраняется в базе данных, и он отображается как 4 отдельных элемента в списке. Я хочу сделать только один элемент, похожий на текстовые сообщения. Другим способом я хочу сохранить все эти 4 элемента в базе данных, но хочу показать только последние sms, полученные от этого числа в списке. В списке отображаются только последние sms из 4 сообщений, и когда я нажимаю в элементе списка затем должно отображаться 4 сообщения внутри него.Показать элементы списка в группе по заказу

Кто-то ответил мне, что я могу использовать запрос Group By, чтобы показывать только один смс с одного номера телефона в моем основном списке, но я немного смущен тем, что где поставьте этот запрос. Это мой класс, в котором я создаю таблицу для получения смс.

public class DBtableforNotSpam extends SQLiteOpenHelper { 

public DBtableforNotSpam(Context context) { 
super(context, "dbnotspam.db", null, 
    1); 

} 

@Override 
public void onCreate(SQLiteDatabase db) { 
    try { 
     db.execSQL(Constants.query_createSMSTablee); 
    } catch (SQLException e) { 
     e.printStackTrace(); 
    } 
} 
@Override 
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
} 
} 

Constants.query_createSMSTablee определяется здесь:

public static final String query_createSMSTablee = "create table " + "smss" + "(" + "id" + " integer primary key autoincrement, " 
     + "contactnumber" + " text, " + "contactname" + " text," + "message" + " text," + "date" + " text)"; 

Когда любой смс получил я спасаю его здесь, в этом методе:

screenMessagee(context, msg_from, msg_from, msgBody, msgDate); 

Этот метод определяется здесь:

public void screenMessagee(Context context, String msg_from, String msgSender, 
    String msgBody, String msgDate) { 
    DBtableforNotSpam smsdb = new DBtableforNotSpam(context); 
    SQLiteDatabase dbw = smsdb.getWritableDatabase(); 

    String query_insertSMS = "insert into " + "smss" + "(" + "contactnumber" + "," + "contactname" + "," + "message" 
     + "," + "date" + ") values (\"" + msg_from.toString() + "\", \"" + msgSender + "\",\"" + msgBody 
     + "\",\"" + msgDate + "\")"; 

    dbw.execSQL(query_insertSMS); 
    smsdb.close(); 
    dbw.close(); 
    abortBroadcast(); 

    } 

Когда вы выбираете записи в моем основном списке, я делаю это:

public ArrayList<Sms> fetchScreenedSms() { 
ArrayList<Sms> smsInbox = new ArrayList<Sms>(); 
String query_fetchSMS = "select * from " + "smss" + ";"; 
DBtableforNotSpam smsD = new DBtableforNotSpam(this); 
SQLiteDatabase dbw = smsD.getWritableDatabase(); 
Cursor cursor = dbw.rawQuery(query_fetchSMS, null); 
if (cursor != null) { 
    cursor.moveToLast(); 
    if (cursor.getCount() > 0) { 

    do { 

     Sms message = new Sms(); 
     message.id = cursor.getInt(cursor 
      .getColumnIndex("id")); 
     message.messageNumber = cursor.getString(cursor 
      .getColumnIndex("contactnumber")); 
     message.messageSender = cursor.getString(cursor 
      .getColumnIndex("contactname")); 
     message.messageContent = cursor.getString(cursor 
      .getColumnIndex("message")); 
     message.setDate(cursor.getString(cursor 
      .getColumnIndex("date"))); 
     smsInbox.add(message); 
    } while (cursor.moveToPrevious()); 
    } else { 
    empty.setVisibility(View.VISIBLE); 
    } 

Скажите, пожалуйста, где поставить запрос GROU BY phonenumber так, чтобы в моем основном списке отображалось только одно смс-шоу на номер телефона. Я попытался написать GROUP BY в методе fetchScreenSms, но ничего не отображается в моем списке, если используется GROUP BY Query. Может быть, потому что у меня нет отдельной колонки для номера звонков. Пожалуйста, помогите

+0

Вы должны использовать развернутое представление списка. И правильный синтаксис запроса принадлежит вашему предыдущему вопросу. –

+0

любая небольшая помощь по коду? –

ответ

0

Предложение group by не все, что вам нужно. Вы должны указать базу данных, что вас интересует внутри этих групп.

Вы могли бы попробовать, что для меня это сработало:

select max(id) from smss group by contactnumber

UPDATE я от копирования наклеенного моего обновленного запроса моего редактора и получил результаты. Запрос выглядит в комментариях:

select message from smss where id in (select max(id) from smss group by contactnumber)

но то, что я изменил это название вашего последнего столбца. Имя вашей колонки: date, но date также является типом данных.

Первая таблица показывает все строки в таблице, вторая показывает, что возвращается вложенным запросом.

Result of the query

+0

Если у меня есть 5 сообщений в моей базе данных, в которых из этого номера «9922737» отправлено 3 сообщения, а из этого номера «63525252» - 2 сообщения, тогда вы можете написать запрос для него, чтобы только 1 1 см показывали с этих номеров в главном listview –

+0

@ArslanAli Если вы просто хотите получить сообщение, это (даже если это не красиво) должно работать: 'выберите сообщение из smss, где находится id (выберите max (id) из smss-группы по номеру контакта)' – danny

+0

Хорошо, позвольте мне попробовать я запутался из-за max (id), что что писать в нем –

0

Try следуя линии

String query_fetchSMS = "select * from smss where id in (select max(id) from smss group by contactnumber);"; 
+0

, не работает, этот запрос не показывает какой-либо элемент в моем списке. Мой список не показывает ничего, это применяется –

Смежные вопросы