2013-08-07 1 views
38

Я создаю диспетчер задач. У меня есть tasklist, и я хочу, когда я нажимаю на конкретное имя списка задач, если он пуст, тогда он переходит в действие Add Task, но если у него есть 2 или 3 задания, то он показывает мне эти задачи в него в виде списка.Как получить количество строк в sqlite с помощью Android?

Я пытаюсь получить счет в списке. мой запрос к базе данных, как:

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 имя она возвращается 1, личинка количество задач в нее.

ответ

115

Использование 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(); 
+26

Неэффективно загружать все строки; лучше использовать [queryNumEntries()] (http://developer.android.com/reference/android/database/DatabaseUtils.html#queryNumEntries%28android.database.sqlite.SQLiteDatabase,%20java.lang.String%29). –

+0

Отлично! Это все! – Karra

+0

Спасибо, это помогло вам! – Exceptional

24

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

Это означает, что мой метод базы данных в порядке? – Shweta

+0

Ungureanu Liviu, мой метод Sqlite в порядке ??? – Shweta

+0

Я только что отредактировал свой ответ: теперь метод должен возвращать непосредственно счет строк. –

3

Изменение метода 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); 
    } 
} 
+0

нет, он не работает ... – Shweta

+0

что не работает? попробуйте выполнить запись tasklist_id в logcat, чтобы убедиться, что вы используете ожидаемый идентификатор. –

+0

Ваш метод в порядке, но я думаю, что получаю неправильный идентификатор от OnItemClick(); – Shweta

-1

Я ленивый кодировщик, и не идут на все, что дополнительные методы, создание курсора, конкатенации, переменная поиска и т.д., если это не выгоды.

Если все, что я хочу, это быстрый подсчет строк:

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

Я нахожу простые строки легче читать! Не поймите меня неправильно. Я делаю код более подробным образом, когда это требуется, но если я смогу сделать это в одной строке, я это сделаю!

С уважением,

Джако

EDIT:

Просто посмотрел на дату, вы, вероятно, отсортировали это сейчас:/

+2

Это плохая практика, из-за ее плохой производительности; – AnixPasBesoin

36

Используйте android.database.DatabaseUtils, чтобы получить число сосчитать.

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

Это простая утилита, которая имеет несколько методов-оберток для достижения операций с базой данных.

+4

Это должно быть отмечено как ответ на вопрос ОП. Не нужно писать SQL-запросы или загружать все записи из таблицы. +1. – Martin

+2

Лучший ответ !!! Это самый простой ответ и использование существующей функции. До 2-го верха. – poring91

3

Чтобы запросить таблицу для количества строк в этой таблице, вы хотите, чтобы ваш запрос был как можно более эффективным. Reference.

использовать что-то вроде этого:

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

Я знаю, что это был дан ответ давным-давно, но я хотел бы поделиться этим также:

Этот код очень хорошо работает:

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) 

Это производительность дружелюбной и сэкономить некоторые временного код и шаблонного

Надежды это поможет кто-нибудь когда-нибудь :)

1

ли вы видите, что 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(); 
    } 
} 
+0

Не могли бы вы предоставить более подробную информацию о том, что именно делает запросNumEntries и почему это является серьезным? Спасибо! –

+1

Он идет на 4 уровня глубиной и выполняет множество коллаборационного кода, чтобы сделать то же самое, что и в моем ответе. Экономия кода с использованием этой вспомогательной библиотеки сомнительна –

 Смежные вопросы

  • Нет связанных вопросов^_^