在按订单分组中显示Listview项目

时间:2016-07-20 08:13:47

标签: android sqlite listview group-by

我正在开发一个短信应用程序。收到sms后,它会保存在sqlite db中,并在listview中显示为listview项目。现在问题是"如果从这个号码收到了4条消息,那就说" 090071222"然后每次短信保存在数据库中,它在列表视图中显示为4个单独的项目。我想只制作一个类似于短信应用的项目。换句话说,我想在数据库中保存所有这4个项目,但只想在列表视图中显示从该号码收到的最新短信。列表视图中只显示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();

  }

在我的主Listview中获取记录时,我这样做:

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

请告诉我在哪里放置GROUB BY phonenumber Query,以便在我的主列表视图中每个phonenumber只显示一个sms。 我尝试在fetchScreenSms方法中编写GROUP BY,但如果使用GROUP BY Query,我的列表视图中没有显示任何内容。也许是因为我没有为phonenumber单独列。请帮忙

2 个答案:

答案 0 :(得分:0)

group by子句并非您所需要的全部内容。您应该告诉数据库,您在这些组中感兴趣的内容。

你可以试试,对我来说它有用:

select max(id) from smss group by contactnumber

<强>更新 我将更新的查询复制粘贴到我的编辑器并获得结果。查询看起来像在评论中:

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

我更改的内容是您上一栏的名称。您的列名称为date,但date也是一种数据类型。

第一个表显示表中的所有行,第二个表显示嵌套查询返回的内容。

Result of the query

答案 1 :(得分:0)

尝试以下行

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