64

我正在创建任务管理器。我有任务列表,当我点击特定的任务列表名称时,如果它为空,那么它会继续添加任务活动,但如果它有 2 个或 3 个任务,那么它会以列表形式向我显示这些任务。

我正在尝试在列表中计数。我的数据库查询是这样的:

public Cursor getTaskCount(long tasklist_Id) {

    SQLiteDatabase db = this.getWritableDatabase();
    Cursor cursor= db.rawQuery("SELECT COUNT (*) FROM " + TABLE_TODOTASK + " WHERE " + KEY_TASK_TASKLISTID + "=?",
             new String[] { String.valueOf(tasklist_Id) });
    if(cursor!=null && cursor.getCount()!=0)
          cursor.moveToNext();
    return cursor;
}    

在我的活动中:

list_tasklistname.setOnItemClickListener(new OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> arg0,
            android.view.View v, int position, long id) {
                db = new TodoTask_Database(getApplicationContext());
                Cursor c = db.getTaskCount(id);
                System.out.println(c.getCount());
                if(c.getCount()>0) {    
                System.out.println(c);
                Intent taskListID = new Intent(getApplicationContext(), AddTask_List.class);
                task = adapter.getItem(position);
                int taskList_id = task.getTaskListId();
                taskListID.putExtra("TaskList_ID", taskList_id);
                startActivity(taskListID);
            }
            else {
                Intent addTask = new Intent(getApplicationContext(), Add_Task.class);
                startActivity(addTask);
            }
        }
    });
    db.close();
}

但是当我单击任务列表名称时,它会返回 1,机器人任务数。

4

10 回答 10

159

使用DatabaseUtils.queryNumEntries()

public long getProfilesCount() {
    SQLiteDatabase db = this.getReadableDatabase();
    long count = DatabaseUtils.queryNumEntries(db, TABLE_NAME);
    db.close();
    return count;
}

或(更低效

public int getProfilesCount() {
    String countQuery = "SELECT  * FROM " + TABLE_NAME;
    SQLiteDatabase db = this.getReadableDatabase();
    Cursor cursor = db.rawQuery(countQuery, null);
    int count = cursor.getCount();
    cursor.close();
    return count;
}

在活动中:

int profile_counts = db.getProfilesCount();
    db.close();
于 2013-08-07T08:38:58.140 回答
48

使用android.database.DatabaseUtils获取计数。

public long getTaskCount(long tasklist_Id) {
        return DatabaseUtils.queryNumEntries(readableDatabase, TABLE_NAME);
}

它是一个简单的实用程序,具有多种包装方法来实现数据库操作。

于 2015-02-05T15:43:02.670 回答
39

c.getCount()返回1,因为游标包含单行(带有 real 的行COUNT(*))。您需要的计数是int游标中第一行的值。

public int getTaskCount(long tasklist_Id) {

    SQLiteDatabase db = this.getReadableDatabase();
    Cursor cursor= db.rawQuery(
        "SELECT COUNT (*) FROM " + TABLE_TODOTASK + " WHERE " + KEY_TASK_TASKLISTID + "=?",
         new String[] { String.valueOf(tasklist_Id) }
    );
    int count = 0;
    if(null != cursor)
        if(cursor.getCount() > 0){
          cursor.moveToFirst();    
          count = cursor.getInt(0);
        }
        cursor.close();
    }

    db.close();
    return count;
}   
于 2013-08-07T08:02:51.027 回答
7

我知道很久以前就有人回答了,但我也想分享一下:

这段代码效果很好:

SQLiteDatabase db = this.getReadableDatabase();
long taskCount = DatabaseUtils.queryNumEntries(db, TABLE_TODOTASK);

但是如果我不想计算所有行并且我有条件申请怎么办?

DatabaseUtils 有另一个功能:DatabaseUtils.longForQuery

long taskCount = DatabaseUtils.longForQuery(db, "SELECT COUNT (*) FROM " + TABLE_TODOTASK + " WHERE " + KEY_TASK_TASKLISTID + "=?",
         new String[] { String.valueOf(tasklist_Id) });

longForQuery文档说:

在数据库上运行查询并返回第一行第一列中的值的实用方法。

public static long longForQuery(SQLiteDatabase db, String query, String[] selectionArgs)

它是性能友好的,可以为您节省一些时间和样板代码

希望有一天这会对某人有所帮助:)

于 2016-10-28T06:56:04.433 回答
4

将您的 getTaskCount 方法更改为:

public int getTaskCount(long tasklist_id){
    SQLiteDatabase db = this.getWritableDatabase();
    Cursor cursor= db.rawQuery("SELECT COUNT (*) FROM " + TABLE_TODOTASK + " WHERE " + KEY_TASK_TASKLISTID + "=?", new String[] { String.valueOf(tasklist_id) });
    cursor.moveToFirst();
    int count= cursor.getInt(0);
    cursor.close();
    return count;
}

然后,相应地更新点击处理程序:

public void onItemClick(AdapterView<?> arg0, android.view.View v, int position, long id) {
    db = new TodoTask_Database(getApplicationContext());

    // Get task list id
    int tasklistid = adapter.getItem(position).getTaskListId();

    if(db.getTaskCount(tasklistid) > 0) {    
        System.out.println(c);
        Intent taskListID = new Intent(getApplicationContext(), AddTask_List.class);
        taskListID.putExtra("TaskList_ID", tasklistid);
        startActivity(taskListID);
    } else {
        Intent addTask = new Intent(getApplicationContext(), Add_Task.class);
        startActivity(addTask);
    }
}
于 2013-08-07T08:06:05.753 回答
4

为了在表中查询该表中的行数,您希望查询尽可能高效。参考

使用这样的东西:

/**
 * Query the Number of Entries in a Sqlite Table
 * */
public long QueryNumEntries()
{
    SQLiteDatabase db = this.getReadableDatabase();
    return DatabaseUtils.queryNumEntries(db, "table_name");
}
于 2015-10-24T04:52:19.333 回答
2

你看到DatabaseUtils.queryNumEntries()做了什么吗?太可怕了!我用这个。

public int getRowNumberByArgs(Object... args) {
    String where = compileWhere(args);
    String raw = String.format("SELECT count(*) FROM %s WHERE %s;", TABLE_NAME, where);
    Cursor c = getWriteableDatabase().rawQuery(raw, null);
    try {
        return (c.moveToFirst()) ? c.getInt(0) : 0;
    } finally {
        c.close();
    }
}
于 2017-08-31T14:20:01.623 回答
2

获取行数非常简单:

cursor = dbObj.rawQuery("select count(*) from TABLE where COLUMN_NAME = '1' ", null);
cursor.moveToFirst();
String count = cursor.getString(cursor.getColumnIndex(cursor.getColumnName(0)));
于 2018-11-03T16:54:56.660 回答
0

查看来源DatabaseUtils我们可以看到queryNumEntries使用select count(*)...查询。

public static long queryNumEntries(SQLiteDatabase db, String table, String selection,
        String[] selectionArgs) {
    String s = (!TextUtils.isEmpty(selection)) ? " where " + selection : "";
    return longForQuery(db, "select count(*) from " + table + s,
                selectionArgs);
}
于 2021-08-09T14:23:32.237 回答
-1

一旦你得到光标,你可以做

Cursor.getCount()
于 2018-07-10T16:02:30.863 回答