我在我的Android应用程序中创建了一个Sqlite数据库,它看起来像这样:
create table msgs ( id integer primary key autoincrement, msg text not null, session text not null, sender text not null);
我可以像这样获得所有条目,但我不会理解正在发生的事情。
String[] allColumns = {"msg","session","sender"};
Cursor cursor = database.query(msgs, allColumns, id = insertId, null, null, null, null);
我想做的是,只能通过一个独特的会话获取最新的条目我该如何在android中执行此操作?
编辑:如果这是mysql我会做“SELECT MAX(id)AS id2,msg,session FROM msgs GROUP BY session” 但是无法在SQLite中使用它:/
答案 0 :(得分:1)
要执行完整的SQL查询,可以使用rawQuery
:
cursor = database.rawQuery("SELECT MAX(id) AS id2,msg, session FROM msgs GROUP BY session", null);
使用query
,您必须设置如下参数:
cursor = database.query("msgs",
new String[] { "MAX(id) AS id2", "msg", "session" },
null, null,
"session",
null, null);
请注意,在SQLite版本3.7.11(Android API版本16,Jelly Bean)之前,在聚合查询中使用未聚合的列(msg
)不起作用。
答案 1 :(得分:0)
始终检查documentation并注意类型!
您使用以下方法:
query(
msgs, //String table: OK
allColumns, //String[] columns: OK
id = insertId, //String selection: NOT OK
// ^--- this is a boolean which will render SQL something like
// "SELECT ... WHERE TRUE ..." or "SELECT ... WHERE FALSE ..."
// causing all rows or none to be displayed
null, //String[] selectionArgs: OK
null, //String groupBy: OK
null, //String having: OK
null); //String orderBy: OK
校正:
query(
msgs, //table
allColumns, //columns
"id = ?", //selection
new String[] {String.valueOf(insertId)}, //selectionArgs
null, //groupBy
null, //having
null); //orderBy