我有一个列表视图,其中显示从联系号码收到的消息。现在的问题是,如果我收到了来自" 1234567"以及来自" 56789"的3条消息然后我的主要列表视图显示了8条消息,虽然我只想在我的主要lisvtiew中显示这些数字的1条消息,类似于短信应用程序作为线程和项目点击剩余消息应显示该特定数字。 有人回答我使用群发查询按电话号码查询结果。 收到任何短信后,我将其保存在名为" smss"的表中。 这是从数据库中获取数据时的代码:
public ArrayList<Sms> fetchScreenedSms() {
Sms a = new Sms();
ArrayList<Sms> smsInbox = new ArrayList<Sms>();
String query_fetchSMS = "select * from " + "smss" + " group by " + "contactnumber" + "\"" ;
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);
}
这是我在数据库中保存短信的代码:
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();
}
现在我在某人建议的fetchScreenSms方法中逐个查询,但是如果应用了这个,那么listview没有显示任何内容,即它是空的listview数据:
String query_fetchSMS = "select * from " + "smss" + " group by " + "contactnumber" + " = \"" + "\"" ;
这是某人建议的,但它在列表视图中没有显示任何内容 当我应用这个时,listview显示与该数字相关的数据。
String query_fetchSMS = "select * from " + "smss" + " group by " + "contactnumber" + " = \"" + "1234567" + "\"" ;
在此查询之后,列表视图在我的主列表视图中显示来自此编号的一条消息,然后在其中显示5条消息。这正是我想要的。但为什么上层查询不起作用?我想显示两个号码消息
出现问题的原因是什么? 使用简单的逐个查询组时不显示结果,但是当我在group by中指定数字时显示结果。 任何人请帮助Iam卡住
答案 0 :(得分:1)
如果您使用prepared statements,则不会遇到这些问题。它们通常更快(如果您需要多次执行相同的查询),更强大,通常不会导致难以解决的语法错误。
PreparedStatement pstmt = con.prepareStatement( "insert into smss " +
"(contactnumbe,contactname,message,date)" +
"values (?,?,?,?)";
看看它有多简单?然后您可以逐个绑定参数。无需担心正确逃离它们。准备好的陈述会自动为您解决。
stmt.setInt(msg_from.toString());
每个参数的等等。按问题到达你的GROUP,我会尝试这样的事情:
"select contactnumber, contactname, count(*) from smss group by contactnumber" ;
请注意,您可以执行SELECT * FROM smss,但是日期和消息列是不确定的,因为您按联系人编号进行分组。如果来自同一号码的多条消息,则无法保证将显示哪个日期和消息。但是,也可以通过巧妙地使用子查询和按顺序来控制。
答案 1 :(得分:0)
"select * from " + "smss" + " group by " + "contactnumber" + " = \"" + "\"" ;
这不是有效的SQL查询 此查询将呈现为
"select * from smss group by contactnumber = "1234567"";
这里缺少的是“where”运算符。您的查询应包含此内容,如下所示:
"select * from smss where contactnumber = "1234567" OR contactnumber = "56789" group by contactnumber";
或者像你一样显示它:
"select * from " + "smss" + " where " + "contactnumber" + " = \"" + "1234567\"" + " OR " + "contactnumber" + " = \"" + "56789\"" + " group by " + "contactnumber";