web-dev-qa-db-fra.com

Comment obtenir le nombre de lignes dans sqlite avec Android?

Je crée un gestionnaire de tâches. J'ai une liste de tâches et je veux quand je clique sur le nom d'une liste de tâches particulière si elle est vide, elle passe ensuite à l'activité Ajouter une tâche, mais si elle comporte 2 ou 3 tâches, elle me montre ces tâches dans un formulaire.

J'essaie de compter dans la liste. ma requête de base de données est comme:

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

Dans mon activité:

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

mais lorsque je clique sur le nom de la liste de tâches, il renvoie 1, le nombre de tâches correspondant est élevé.

50
Shweta

Utilisation de DatabaseUtils.queryNumEntries():

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

ou ( plus inefficacement )

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

En activité:

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

Utilisez Android.database.DatabaseUtils pour obtenir le nombre de comptes.

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

C'est un utilitaire simple qui possède plusieurs méthodes d'encapsulation pour effectuer des opérations de base de données.

43
Mayur Raiyani

c.getCount() renvoie 1 car le curseur ne contient qu'une seule ligne (celle contenant le vrai COUNT(*)). Le nombre dont vous avez besoin est la valeur int de la première ligne du curseur.

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;
}   
29
Ungureanu Liviu

Je sais qu'il a été répondu il y a longtemps, mais j'aimerais partager ceci aussi:

Ce code fonctionne très bien:

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

MAIS que faire si je ne veux pas compter toutes les lignes et que j'ai une condition à appliquer?

DatabaseUtils a une autre fonction pour cela: DatabaseUtils.longForQuery

long taskCount = DatabaseUtils.longForQuery(db, "SELECT COUNT (*) FROM " + TABLE_TODOTASK + " WHERE " + KEY_TASK_TASKLISTID + "=?",
         new String[] { String.valueOf(tasklist_Id) });

La documentation longForQuery indique:

Méthode utilitaire pour exécuter la requête sur la base de données et renvoyer la valeur dans la première colonne de la première ligne.

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

Il est performant et vous permet d’économiser du code time et du code standard. 

J'espère que cela aidera quelqu'un un jour :)

5
MBH

Pour interroger une table sur le nombre de lignes qu'il contient, vous souhaitez que votre requête soit aussi efficace que possible. Référence .

Utilisez quelque chose comme ceci:

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

Changez votre méthode getTaskCount en ceci:

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

Ensuite, mettez à jour le gestionnaire de clics en conséquence:

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);
    }
}
3
Markus Penguin

Voyez-vous ce que DatabaseUtils.queryNumEntries () fait? C'est affreux! Je l'utilise.

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

Une fois que vous avez le curseur, vous pouvez faire 

Cursor.getCount ()

0
Shyam Sunder

Tellement simple d'obtenir le nombre de lignes:

cursor = dbObj.rawQuery("select count(*) from TABLE where COLUMN_NAME = '1' ", null);
cursor.moveToFirst();
String count = cursor.getString(cursor.getColumnIndex(cursor.getColumnName(0)));
0
ghislaink