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

我正在创build任务pipe理器。 我有任务列表,我希望当我点击特定的任务列表名称,如果它是空的,然后继续添加任务活动,但如果它有2或3个任务,然后以列表forms显示我的这些任务。

我正在试图列入清单。 我的数据库查询是这样的:

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,任务的bot数量。 请build议。 谢谢

使用DatabaseUtils.queryNumEntries()

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

或( 更低效地

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

在活动中:

 int profile_counts = db.getProfilesCount(); db.close(); 

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

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

具有多个包装器方法来实现数据库操作是很容易的工具。

c.getCount()返回1,因为光标包含一个单一的行(真正的计数)。 您需要的计数是游标中第一行的整数值。

而不是System.out.println(c.getCount()); 尝试System.out.println(c.getInt(0));

编辑

  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 = c.getInt(0); } cursor.close(); } db.close(); return count; } 

改变你的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); } } 

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

使用这样的东西:

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

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

这个代码工作得很好:

 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文档说:

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

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

这是性能友好,节省您一些时间和样板代码

希望这将有助于某个人:)

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

我是一个懒惰的编码器,并没有进入所有额外的方法,游标创build,string连接,variablessearch等,除非它是有益的。

如果我只想要快速计数的行数:

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

我发现简单的string更容易阅读! 不要误解我的意思,如果需要,我会以更详细的方式进行编码,但如果我能做到这一点,我会!

问候,

jackson

编辑:

刚刚看了一下date,你可能已经sorting了这个:/