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

时间:2013-08-07 07:56:39

标签: android android-sqlite onitemclicklistener

我正在创建任务管理器。我有任务列表,我希望当我点击特定的任务列表名称时,如果它为空,那么它继续添加任务活动,但如果它有2或3个任务,那么它会以列表形式向我显示这些任务。

我想在列表中计算。我的数据库查询如下:

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,机器人数量的任务。

11 个答案:

答案 0 :(得分:136)

使用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();

答案 1 :(得分:44)

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

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

这是一个简单的实用程序,它有多个包装器方法来实现数据库操作。

答案 2 :(得分:30)

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

答案 3 :(得分:5)

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

此代码非常有效:

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)

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

希望有一天能帮到某人:)

答案 4 :(得分:4)

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

使用类似的东西:

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

答案 5 :(得分: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);
    }
}

答案 6 :(得分:2)

你看到 DatabaseUtils.queryNumEntries()的作用了吗?太可怕了! 我用这个。

   <?php

    use Zend\Mvc\Application;

    /**
     * Display all errors when APPLICATION_ENV is development.
     */
    if ($_SERVER['APPLICATION_ENV'] === 'development') {
        error_reporting(E_ALL);
        ini_set("display_errors", 1);
    }

    /**
     * This makes our life easier when dealing with paths. Everything is relative
     * to the application root now.
     */
    chdir(dirname(__DIR__));

    // Decline static file requests back to the PHP built-in webserver
    if (php_sapi_name() === 'cli-server') {
        $path = realpath(__DIR__ . parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH));
        if (__FILE__ !== $path && is_file($path)) {
            return false;
        }
        unset($path);
    }

    // Composer autoloading
    include __DIR__ . '/../vendor/autoload.php';

    if (! class_exists(Application::class)) {
        throw new RuntimeException(
            "Unable to load application.\n"
            . "- Type `composer install` if you are developing locally.\n"
            . "- Type `vagrant ssh -c 'composer install'` if you are using Vagrant.\n"
            . "- Type `docker-compose run zf composer install` if you are using Docker.\n"
        );
    }

    // Retrieve configuration
    $appConfig = require __DIR__ . '/../config/application.config.php';
    if (file_exists(__DIR__ . '/../config/development.config.php')) {
        $appConfig = ArrayUtils::merge($appConfig, require __DIR__ . '/../config/development.config.php');
    }

    // Run the application!
    Application::init($appConfig)->run();

答案 7 :(得分:0)

一旦获得光标,就可以完成

Cursor.getCount()

答案 8 :(得分:0)

很容易获得行数:

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

答案 9 :(得分:0)

查看 DatabaseUtils 的来源,我们可以看到 queryNumEntries 使用 select count(*)... 查询。

public static long queryNumEntries(SQLiteDatabase db, String table, String selection,
        String[] selectionArgs) {
    String s = (!TextUtils.isEmpty(selection)) ? " where " + selection : "";
    return longForQuery(db, "select count(*) from " + table + s,
                selectionArgs);
}

答案 10 :(得分:-1)

我是一个懒惰的程序员,除非有益,否则不要进入所有额外的方法,光标创建,字符串连接,变量搜索等。

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

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

我确实发现简单的字符串更容易阅读!别对我说错了我在需要的时候以更冗长的方式编写代码,但是如果我能做到一行我就会这样做!

此致

亚茨科

编辑:

只是查看日期,您可能已经对此进行了排序:/