【问题标题】:How to get row count in sqlite using Android?如何使用 Android 在 sqlite 中获取行数?
【发布时间】:2013-08-07 07:56:38
【问题描述】:

我正在创建任务管理器。我有任务列表,当我单击特定的任务列表名称时,如果它为空,则它会继续添加任务活动,但如果它有 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,机器人任务数。

【问题讨论】:

    标签: android android-sqlite onitemclicklistener


    【解决方案1】:

    使用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();
    

    【讨论】:

    • 加载所有行效率低;更好地使用queryNumEntries()
    • 如果要统计特定条件的行,queryNumEntries() 方法也可以带selectionselectionArgs 参数。见developer.android.com/reference/android/database/…
    • @CL。 queryNumEntries() 很有用,感谢指出,省了很多代码:)
    • 要获得计数,您永远不应该在游标上执行 getCount。这会将数据库中的所有结果都带入内存,从而使用更多内存。相反,您可以使用“SELECT COUNT(*) FROM”+ TABLE_NAME。然后将结果存储在光标的第 0 列中。
    【解决方案2】:

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

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

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

    【讨论】:

    • 这应该被标记为 OP 问题的答案。无需编写任何 SQL 查询或从表中加载所有条目。 +1。
    • 最佳答案!!!这是最简单的答案并利用现有功能。直到第二个顶部。
    【解决方案3】:

    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;
    }   
    

    【讨论】:

    • 说明我的数据库方法没问题?
    • 我刚刚编辑了我的答案:现在该方法应该直接返回行数。
    • 有一个错字..应该是 cursor.getInt(0);而不是 c.getInt(0);
    【解决方案4】:

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

    这段代码运行良好:

    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)
    

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

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

    【讨论】:

      【解决方案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;
      }
      

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

      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);
          }
      }
      

      【讨论】:

      • 什么不起作用?尝试将 tasklist_id 记录到 logcat 以确保您使用的是预期的 id。
      • 你的方法很好,但我认为我从 OnItemClick() 得到的 id 错误;
      • 从 task.getTaskListId() 传递 taskList_id 而不是将“id”传递给 getTaskCount - 正如您稍后在 if 语句中所做的那样。
      • 我不能这样做,因为task是Task类对象但addtask是ADDTask类对象,addtask不能使用适配器,我怎样才能得到位置或id?
      • 我已经用听众的代码更新了我的答案,这行得通吗?
      【解决方案6】:

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

      使用这样的东西:

      /**
       * Query the Number of Entries in a Sqlite Table
       * */
      public long QueryNumEntries()
      {
          SQLiteDatabase db = this.getReadableDatabase();
          return DatabaseUtils.queryNumEntries(db, "table_name");
      }
      

      【讨论】:

        【解决方案7】:

        你看到 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();
            }
        }
        

        【讨论】:

        • 您能否提供更多信息,说明 queryNumEntries 究竟做了什么以及为什么它很棒?谢谢!
        • 它深入 4 层并执行大量附属代码来执行与我在答案中所写相同的事情。使用此帮助程序库的代码大小经济性值得怀疑
        • 我同意,这太糟糕了。使用 count(*) 是正确答案。
        【解决方案8】:

        获取行数非常简单:

        cursor = dbObj.rawQuery("select count(*) from TABLE where COLUMN_NAME = '1' ", null);
        cursor.moveToFirst();
        String count = cursor.getString(cursor.getColumnIndex(cursor.getColumnName(0)));
        

        【讨论】:

          【解决方案9】:

          查看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);
          }
          

          【讨论】:

            【解决方案10】:

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

            Cursor.getCount()
            

            【讨论】:

              猜你喜欢
              • 2011-09-15
              • 1970-01-01
              • 1970-01-01
              • 2019-10-09
              • 1970-01-01
              • 1970-01-01
              • 2015-02-27
              • 1970-01-01
              • 2012-06-27
              相关资源
              最近更新 更多