Q如何使用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;
}    

在我的活动中:

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

但是,当我单击tasklist name时,它将返回1,bot任务数。

2018-01-24 09:23:45  user2025187

A回答

  • 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();
    
    2018-01-24 09:22:45  user2025187 Exceptional
    • 35
      加载所有行是低效的;最好使用querynumentries%28android.database.sqlite.sqlitedatabase、%20java.lang.string%29“rel=”nofollow noreferrer“>querynumentries() – CL. Dec 7 '14 at 20:45
    • 如果要对具有特定条件的行进行计数,queryNumEntries()方法还可以采用selectionselectionArgs参数。请参阅developer.android.com/reference/android/database/&hellip; – ban-geoengineering Feb 2 '18 at 15:56
    • @cl.querynumentries()非常有用,感谢您指出,保存了许多行代码:) – TapanHP Jul 19 '18 at 11:06
    • 若要获取计数,不应在光标上执行get count。这将把数据库中的所有结果放入内存,从而使用更多的内存。相反,您可以使用";select count(*)from";+table_name。然后结果将存储在光标的第0列。 – Jona Feb 28 at 22:46
  • 2

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

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

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

    2018-11-01 15:20:20  John Cummings Mayur Raiyani
    • 4
      这应该标记为对操作问题的回答。无需编写任何sql查询或从表中加载所有条目。+1. – Martin Jul 7 '15 at 9:04
    • 2
      最佳答案!!!这是最简单的答案,并利用现有的特征。一直到第二个顶部。 – poring91 Dec 13 '15 at 12:22
  • 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;
    }   
    
    2018-01-22 15:25:48  RousseauAlexandre Ungureanu Livi
    • 这意味着我的数据库方法可以吗? – Shweta Aug 7 '13 at 8:31
    • ungureanu liviu,我的sqlite方法可以吗??? – Shweta Aug 7 '13 at 8:36
    • 我刚刚编辑了我的答案:现在方法应该直接返回行数。 – Ungureanu Liviu Aug 7 '13 at 8:52
    • 2
      有一个输入错误。它应该是cursor.getint(0);而不是c.getint(0); – zain ullah Nov 30 '16 at 15:04
    • @zainullah,我编辑了答案以更正此问题 – RousseauAlexandre Jan 22 '18 at 15:54
  • 4

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

    这段代码工作得很好:

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

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

    数据库实用程序还有另一个功能: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-28 06:56:04  MBH
  • 5

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

    使用这样的方法:

    /**
     * Query the Number of Entries in a Sqlite Table
     * */
    public long QueryNumEntries()
    {
        SQLiteDatabase db = this.getReadableDatabase();
        return DatabaseUtils.queryNumEntries(db, "table_name");
    }
    
    2015-10-24 04:52:19  Mangi Morobe
  • 6

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

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

    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-07 09:03:17  Markus Penguin
    • 不,它不工作… – Shweta Aug 7 '13 at 8:32
    • 什么不起作用?尝试将tasklist\u id记录到logcat,以确保您使用的是预期的id。 – Markus Penguin Aug 7 '13 at 8:39
    • 您的方法很好,但我想我从onitemclick()得到的id是错误的; – Shweta Aug 7 '13 at 8:53
    • 而不是从task.gettasklistid()传递";id";给gettaskcount pass tasklistid,正如您稍后在if语句中所做的那样。 – Markus Penguin Aug 7 '13 at 8:57
    • 我不能这样做,因为task是task类对象,而addtask是addtask类对象,addtask不能使用适配器,如何获取位置或id? – Shweta Aug 7 '13 at 9:01
    • 我已经用监听器的代码更新了我的答案,这有效吗? – Markus Penguin Aug 7 '13 at 9:04
    • 我使用了cursor.getcount();它返回值 – Shweta Aug 7 '13 at 9:08
    • 你说得对,我可以像这样传递task.gettasklistid() – Shweta Aug 7 '13 at 9:10
  • 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();
        }
    }
    
    2017-08-31 14:20:01  Stanislav Perchenko
    • 您能否提供更多信息,说明querynumentries究竟做了什么,以及为什么它令人敬畏?谢谢您! – Ray Li Oct 30 '17 at 0:26
    • 1
      它深入到4个层次,并执行许多辅助代码来完成我在回答中所写的相同任务。使用此帮助程序库的代码大小经济性值得怀疑 – Stanislav Perchenko Nov 22 '17 at 13:33
    • 我同意,这很糟糕。使用count(*)是正确的答案。 – mes Jun 22 '18 at 6:40
  • 8

    很容易获得行数:

    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-03 16:54:56  ghislaink
  • 9

    一旦得到光标,您就可以进行操作

    Cursor.getCount()
    
    2019-04-26 09:44:48  AS Mackay Shyam Sunder
  • 10

    我是一个懒散的程序员,除非有好处,否则不要使用所有额外的方法、光标创建、字符串连接、变量搜索等。

    如果我只想快速清点行数:

    if ((db.rawQuery("SELECT column FROM table", null).getCount()) > 0) {
    // Do stuff
    }
    

    我确实觉得简单的字符串更容易阅读!别误会,我在需要的时候会用更详细的方式编写代码,但如果我能用一行代码就行了!

    问候,

    杰克

    编辑:

    刚刚看了日期,您现在可能已经对它进行了排序:/

    2015-01-24 20:10:30  Jacko
    • 2
      这是一种不好的做法,因为它的性能很差; – Anix PasBesoin Jul 13 '15 at 18:32