如何使用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了这个:/
- 错误:呈现问题以下类无法findandroid.support.v7.internal.widget.ActionBarOverlayLayout
- Android Activity作为对话框
- 与依赖'com.android.support:support-annotations'冲突。 应用程序(23.1.0)和testing应用程序(23.0.1)的已解决版本不同
- testing应用内结算:“发布商无法购买此项目”
- Android – 片段事务的自定义animation未运行
- SurfaceView和View的区别?
- 是否可以扩展AbsListView来创build新的ListView实现?
- 在build.properties中找不到key.store和key.alias属性
- 如何在Android中获取当前date?