我正在开发一个短信应用程序。收到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单独列。请帮忙
答案 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
也是一种数据类型。
第一个表显示表中的所有行,第二个表显示嵌套查询返回的内容。
答案 1 :(得分:0)
尝试以下行
String query_fetchSMS = "select * from smss where id in (select max(id) from smss group by contactnumber);";