2013-08-07 25 views
38

Tôi đang tạo trình quản lý tác vụ. Tôi có tasklist và tôi muốn khi tôi bấm vào tên tasklist cụ thể nếu nó trống thì nó sẽ hoạt động Add Task nhưng nếu nó có 2 hoặc 3 nhiệm vụ thì nó cho tôi thấy những nhiệm vụ đó trong danh sách.Làm cách nào để nhận số hàng trong sqlite bằng Android?

Tôi đang cố gắng đếm trong danh sách. truy vấn cơ sở dữ liệu của tôi là như sau:

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

Trong hoạt động của tôi:

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

nhưng khi tôi bấm vào tên tasklist nó được trở về 1, số bot nhiệm vụ vào nó.

Trả lời

115

Sử dụng DatabaseUtils.queryNumEntries():

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

hoặc (mo lại không hiệu quả)

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

Trong Hoạt động:

int profile_counts = db.getProfilesCount(); 
    db.close(); 
+26

Việc tải tất cả các hàng là không hiệu quả; sử dụng tốt hơn [queryNumEntries()] (http://developer.android.com/reference/android/database/DatabaseUtils.html#queryNumEntries%28android.database.sqlite.SQLiteDatabase,%20java.lang.String%29). –

+0

Hoàn hảo! Đây là tất cả! – Karra

+0

Cảm ơn, nó đã giúp bạn! – Exceptional

24

c.getCount() trả về 1 vì con trỏ chứa một hàng duy nhất (hàng có COUNT(*) thực). Số bạn cần là giá trị int của hàng đầu tiên trong con trỏ.

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

Điều đó có nghĩa là phương pháp cơ sở dữ liệu của tôi là tốt? – Shweta

+0

Ungureanu Liviu, Phương pháp Sqlite của tôi là tốt ??? – Shweta

+0

Tôi vừa sửa câu trả lời của mình: bây giờ phương thức sẽ trả về trực tiếp số lượng hàng. –

3

Thay đổi Phương pháp getTaskCount của bạn như thế này:

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

Sau đó, cập nhật các handler nhấp chuột phù hợp:

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

không có nó không hoạt động ... – Shweta

+0

những gì không hoạt động? hãy thử đăng nhập tasklist_id để đăng nhập để đảm bảo rằng bạn đang sử dụng id dự kiến. –

+0

Phương pháp của bạn là tốt nhưng tôi nghĩ rằng tôi nhận được id sai từ OnItemClick(); – Shweta

-1

Tôi là một coder lười biếng, và không đi vào tất cả những gì phương thức bổ sung, sáng tạo con trỏ, nối chuỗi, biến tìm kiếm vv trừ khi đó là lợi ích.

Nếu tất cả tôi muốn là một số nhanh chóng của hàng:

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

tôi không tìm thấy chuỗi đồng bằng dễ đọc hơn! Đừng làm cho tôi sai tôi làm mã trong một cách chi tiết hơn khi nó được yêu cầu, nhưng nếu tôi có thể làm điều đó một dòng tôi sẽ!

Kính trọng,

Jacko

EDIT:

Chỉ cần nhìn vào ngày, bạn có thể đã được sắp xếp này bằng cách bây giờ:/

+2

Đây là một thực tế không tốt vì hiệu suất kém; – AnixPasBesoin

36

Sử dụng android.database.DatabaseUtils để có được số đếm.

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

Đây là tiện ích dễ dàng có nhiều phương pháp bao bọc để thực hiện các thao tác cơ sở dữ liệu.

+4

Điều này sẽ được đánh dấu là câu trả lời cho câu hỏi của OP. Không cần phải viết bất kỳ truy vấn SQL nào hoặc tải tất cả các mục nhập từ bảng. +1. – Martin

+2

Câu trả lời hay nhất !!! Đây là câu trả lời đơn giản nhất và sử dụng tính năng hiện có. Lên đến đỉnh thứ 2. – poring91

3

Để truy vấn bảng cho số hàng trong bảng đó, bạn muốn truy vấn của mình hiệu quả nhất có thể. Reference.

Sử dụng một cái gì đó như thế này:

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

Tôi biết nó đang được trả lời thời gian dài trước đây, nhưng tôi muốn chia sẻ điều này cũng:

Mã này hoạt động rất tốt:

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

NHƯNG những gì nếu tôi không muốn đếm tất cả các hàng và tôi có một điều kiện để áp dụng?

DatabaseUtils có chức năng khác cho việc này: DatabaseUtils.longForQuery

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

Các tài liệu longForQuery nói: phương pháp

Utility để chạy các truy vấn trên db và trả về giá trị trong cột đầu tiên của đầu tiên hàng.

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

Đó là hiệu suất thân thiện và giúp bạn tiết kiệm một số mã thời gian và soạn sẵn

Hy vọng điều này sẽ giúp ai đó một ngày nào đó :)

1

Bạn có thấy những gì DatabaseUtils.queryNumEntries() có hoạt động không? Thật kinh khủng! Tôi sử dụng cái này.

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

Bạn có thể vui lòng cung cấp thêm thông tin về truy vấn nàoNumEntries thực hiện chính xác không và tại sao nó lại là điều đáng sợ? Cảm ơn bạn! –

+1

Nó đi 4 cấp độ sâu và thực hiện rất nhiều mã ký quỹ để làm điều tương tự như tôi đã viết trong câu trả lời của tôi. Nền kinh tế kích thước mã với việc sử dụng thư viện trợ giúp này là đáng ngờ –

Các vấn đề liên quan