如何使用Android在sqlite中获取行数?

Shw*_*eta 54 android onitemclicklistener android-sqlite

我正在创建任务管理器.我有任务列表,我希望当我点击特定的任务列表名称时,如果它为空,那么它继续添加任务活动,但如果它有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;
}    
Run Code Online (Sandbox Code Playgroud)

在我的活动中:

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();
}
Run Code Online (Sandbox Code Playgroud)

但当我点击任务列表名称时,它返回1,机器人数量的任务.

小智 141

使用DatabaseUtils.queryNumEntries():

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

或者(效率更低)

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;
}
Run Code Online (Sandbox Code Playgroud)

在活动中:

int profile_counts = db.getProfilesCount();
    db.close();
Run Code Online (Sandbox Code Playgroud)

  • 加载所有行是低效的; 更好地使用[queryNumEntries()](http://developer.android.com/reference/android/database/DatabaseUtils.html#queryNumEntries%28android.database.sqlite.SQLiteDatabase,%20java.lang.String%29). (36认同)
  • 要获取计数,您永远不应该对游标执行 getCount 操作。这会将数据库中的所有结果带入内存,从而使用更多内存。相反,您可以使用“SELECT COUNT(*) FROM”+ TABLE_NAME。然后结果将存储在游标的第0列中。 (2认同)

May*_*ani 45

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

public long getTaskCount(long tasklist_Id) {
        return DatabaseUtils.queryNumEntries(readableDatabase, TABLE_NAME);
}
Run Code Online (Sandbox Code Playgroud)

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

  • 这应该标记为OP问题的答案.无需编写任何SQL查询或从表中加载所有条目.+1. (4认同)
  • 最佳答案 !!!这是最简单的答案并利用现有功能.直到第二名. (2认同)

Ung*_*viu 30

c.getCount()返回,1因为游标包含单行(具有真实的行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;
}   
Run Code Online (Sandbox Code Playgroud)

  • 有一个拼写错误..它应该是cursor.getInt(0); 而不是c.getInt(0); (2认同)

MBH*_*MBH 7

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

这段代码非常有效:

SQLiteDatabase db = this.getReadableDatabase();
long taskCount = DatabaseUtils.queryNumEntries(db, TABLE_TODOTASK);
Run Code Online (Sandbox Code Playgroud)

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

DatabaseUtils还有另一个功能: DatabaseUtils.longForQuery

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

longForQuery文件说:

用于在db上运行查询并返回第一行第一列中的值的实用方法.

public static long longForQuery(SQLiteDatabase db, String query, String[] selectionArgs)
Run Code Online (Sandbox Code Playgroud)

它性能友好,节省您的时间和样板代码

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


Mar*_*uin 5

将您的 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;
}
Run Code Online (Sandbox Code Playgroud)

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

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);
    }
}
Run Code Online (Sandbox Code Playgroud)