Android/SQLite-跨多个列的不同计数

Android/SQLite-跨多个列的不同计数,android,sqlite,count,distinct,Android,Sqlite,Count,Distinct,我有以下代码 protected long getNumQueuedChunks(boolean distinctEntries) throws Exception { SQLiteDatabase db = null; try { db = dbhelper.getReadableDatabase(); String whereClause = C_STATUS + " = ? AND " + C_NUM_FAILURES + " < ?"; String[

我有以下代码

protected long getNumQueuedChunks(boolean distinctEntries) throws Exception {

SQLiteDatabase db = null;
try {

    db = dbhelper.getReadableDatabase();

    String whereClause = C_STATUS + " = ? AND " + C_NUM_FAILURES + " < ?";
    String[] whereArgs = new String[] {STATUS_AWAITING_PROCESSING, 10};

    long count = DatabaseUtils.queryNumEntries(db, QUEUE_TABLE_NAME, whereClause, whereArgs);           
    return count;
}
finally {
    try {
        db.close();
    }
    catch(Exception ignore) {
    }
}
受保护的长GetNumQueedChunks(布尔值差异)引发异常{
SQLiteDatabase db=null;
试一试{
db=dbhelper.getReadableDatabase();
字符串whereClause=C_STATUS+“=”和“+C_NUM_FAILURES+”<?”;
String[]wherergs=新字符串[]{STATUS_waiting_PROCESSING,10};
long count=DatabaseUtils.queryNumEntries(db,QUEUE\u TABLE\u NAME,where子句,wherergs);
返回计数;
}
最后{
试一试{
db.close();
}
捕获(异常忽略){
}
}
}

…如果我想返回与WHERE条件匹配的行总数,这很好

但是,我只想计算在这3列中具有不同/唯一数据组合的记录:C_URI、C_BYTE、C_START和C_NUM

我知道我可以做一些像

    String[] columns = {C_URI, C_BYTE_START_NUM, C_NUM_BYTES};
String whereClause = C_STATUS + " = ? AND " + C_NUM_FAILURES + " < ?";
String[] whereArgs = new String[] {STATUS_AWAITING_PROCESSING, "10"};
Cursor c = db.query(true, QUEUE_TABLE_NAME, columns, whereClause, whereArgs, null, null, null, null);
int count = c.getCount();
String[]columns={C_URI,C_BYTE_START_NUM,C_NUM_BYTES};
字符串whereClause=C_STATUS+“=”和“+C_NUM_FAILURES+”<?”;
String[]wherergs=新字符串[]{STATUS_waiting_PROCESSING,“10”};
游标c=db.query(true,队列\表\名称,列,where子句,wherergs,null,null,null,null);
int count=c.getCount();
…但我希望在这种情况下有一种更有效的方法来执行不同的计数

为了更清楚,如果我的表中有这些数据

C|URI | C|U字节| C|U开始| C|U数量| C|U字节

1.jpg | 0 | 1024

1.jpg | 1024 | 1999

2.jpg | 0 | 500

2.jpg | 0 | 500

…不同计数的结果应为3


注意-我已经看到了一个类似的需求描述,但这对我没有帮助,因为我想对3列而不是一列进行不同的计数。

您尝试过SQLiteDatabase.rawQuery()方法吗?您可以将原始SQL查询放入其中,例如:

select distinct C_URI, C_BYTE_START_NUM, C_NUM_BYTES from MyTable 

该方法返回一个游标,您可以立即从游标对象获取计数。当然,如果愿意,也可以指定where子句。然后在获得计数后释放光标。

计数记录的最有效方法是让数据库执行以下操作:

SELECT COUNT(*)
FROM (SELECT DISTINCT Uri,
                      ByteStartNum,
                      NumBytes
      FROM QueueTable)
(对于单独的子查询,在三列上使用DISTINCT或GROUP BY并不重要。)

此查询不符合辅助函数之一(如
query
queryNumEntries
)的约束,因此必须手动构造整个SQL语句:

long getnumquedchunks(){
SQLiteDatabase db=dbhelper.getReadableDatabase();
试一试{
String query=“从中选择计数(*)”+
“(选择不同的“+C_URI+”、“+C_字节”\u开始数+”、“+C_数字节+
“FROM”+队列\表\名称+
其中“+C_状态+”=?”+
“和”+C_NUM_FAILURES+“<10”);
字符串[]args=新字符串[]{STATUS_waiting_PROCESSING};
返回DatabaseUtils.longForQuery(db,query,args);
}最后{
db.close();
}
}