Как получить количество строк в sqlite с помощью Android?
Я создаю диспетчер задач. У меня есть список задач, и я хочу, когда я нажимаю на определенное имя списка задач, если оно пустое, то он идет на добавление деятельности задачи, но если у него есть 2 или 3 задачи, то он показывает мне эти задачи в него в виде списка.
Я пытаюсь получить count в списке. мой запрос к базе данных выглядит так:
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 количество задач в нем.
9 ответов:
Используя
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();
Используйте android.база данных.DatabaseUtils, чтобы получить количество кол-во.
public long getTaskCount(long tasklist_Id) { return DatabaseUtils.queryNumEntries(readableDatabase, TABLE_NAME); }
Это простая утилита, которая имеет несколько методов обертки для выполнения операций с базой данных.
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; }
Я знаю, что ответ был дан давно, но я хотел бы поделиться и этим:
Этот код работает очень хорошо:
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)
Это производительность дружелюбный и сэкономит вам некоторое Время и шаблонный код
Надеюсь, что когда-нибудь это кому-нибудь поможет:)
Чтобы запросить таблицу для количества строк в этой таблице, вы хотите, чтобы ваш запрос был максимально эффективным. Ссылка .
Используйте что-то вроде этого:
/** * Query the Number of Entries in a Sqlite Table * */ public long QueryNumEntries() { SQLiteDatabase db = this.getReadableDatabase(); return DatabaseUtils.queryNumEntries(db, "table_name"); }
Измените метод 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); } }
Вы видите, что такое 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(); } }
Я ленивый кодер, и не вдавайтесь во все эти дополнительные методы, создание курсора, конкатенацию строк, поиск переменных и т. д., Если это не приносит пользы.
Если все, что мне нужно, - это быстрый подсчет строк:
if ((db.rawQuery("SELECT column FROM table", null).getCount()) > 0) { // Do stuff }
Я действительно нахожу простые строки более удобными для чтения! Не поймите меня неправильно, я делаю код более подробно, когда это требуется, но если я могу сделать это в одну строку, я сделаю!
С уважением,
Джеко
Правка:
Просто посмотрел на дату, вы, вероятно, отсортировали это по теперь :/