2011-08-28 32 views
22

Tôi có một bảng SQL mà được tạo ra bởi đoạn mã sau:Cách kiểm tra xem con trỏ rỗng trong một Query SQLiteDatabase

public void onCreate(SQLiteDatabase db) { 
    db.execSQL("CREATE TABLE " + TABLE_NAME + " (" + _ID 
     + " INTEGER PRIMARY KEY AUTOINCREMENT, " + SUBJECT 
     + " TEXT NOT NULL," + TOPIC + " TEXT NOT NULL, " 
     + LECTURENUMBER + " TEXT NOT NULL, " + PAGENUMBER 
     + " TEXT NOT NULL, " + DATE + " TEXT NOT NULL, " + _DATA 
     + " TEXT NOT NULL);"); 
} 

tôi truy vấn bảng như sau:

String sql = "SELECT " + _ID + "," + SUBJECT + " FROM " + TABLE_NAME 
    + " GROUP BY " + SUBJECT + ";"; 

Cursor cursor = subjects.getReadableDatabase().rawQuery(sql, null); 

Vấn đề là tôi phải bắt đầu Hoạt động A nếu con trỏ trống (nghĩa là bảng không lưu trữ giá trị) và Hoạt động B nếu con trỏ không trống (nghĩa là bảng được điền).

Tôi không thể tìm thấy phương pháp có thể cho tôi biết liệu bảng có trống hay không. Tôi đã cố gắng sử dụng Log như sau:

private void showSubjectsOnList() { 
    String sql = "SELECT " + _ID + "," + SUBJECT + " FROM " + TABLE_NAME 
     + " GROUP BY " + SUBJECT + ";"; 

    Cursor cursor = subjects.getReadableDatabase().rawQuery(sql, null); 

    Log.d("Events",Integer.toString(cursor.getCount())); 
    if(cursor.isNull(0)!=false){ 
     cursor.close(); 
     subjects.close(); 
     startActivity(new Intent(this,OpenScreen.class)); 
    } 
} 

Nhưng LOG thấy 1, nếu bảng là trống rỗng ... và một lần nữa 1, nếu bảng có 1 entry .... nó cho thấy 2, nếu bảng có hai mục và v.v.

Bạn có thể đề xuất một số phương pháp giải quyết vấn đề bắt đầu các hoạt động khác nhau của tôi dựa trên con trỏ trống hay không.

Trả lời

55

gì về việc kiểm tra con trỏ như thế này, và sau đó làm những gì bạn đã nói:

if(cursor!=null && cursor.getCount()>0) 

getCount()

Trả về số lượng hàng trong con trỏ

http://developer.android.com/reference/android/database/Cursor.html#getCount()

+0

Tôi chưa thử chính xác cách bạn đã đề cập. Nhưng tôi cố gắng sử dụng con trỏ = null là tốt, như sau: Log.d (! "Sự kiện", Boolean.toString (con trỏ = null)); Điều thú vị là Nhật ký hiển thị đúng nếu bảng có một số giá trị, nhưng đáng ngạc nhiên là nhật ký không được hiển thị chút nào nếu bảng trống. Tôi bối rối điều đó có nghĩa là gì. –

+0

Đừng quên di chuyển con trỏ của con trỏ đến bản ghi đầu tiên với 'cursor.moveToFirst()' trước khi bạn kiểm tra –

+0

Điều đó có nghĩa là truy vấn của bạn trả về 0 hàng. Điều đó có nghĩa là con trỏ không phải là null nhưng không có hàng: D –

22

Cách dễ nhất và dễ dàng tổ cách để kiểm tra một con trỏ rỗng là đoạn mã sau:

if (cursor.moveToFirst()) { 
    // start activity a 
} else { 
    // start activity b 
} 

Theo các tài liệu, phương thức trả về false nếu con trỏ rỗng:

http://developer.android.com/reference/android/database/Cursor.html#moveToFirst%28%29

public abstract boolean moveToFirst ()

Đã thêm ở cấp API 1 Di chuyển con trỏ đến hàng đầu tiên.

Phương thức này sẽ trả về false nếu con trỏ trống.

Trả về việc di chuyển có thành công hay không.

+0

Đã thử, nhưng không hoạt động: s –

+0

Còn cursor.moveToNext() ... Tôi nghĩ điều này sẽ trả về true nếu có hàng và sai nếu không tìm thấy hàng ... –

+0

@KarueBensonKarue - nó cũng có thể. Hãy xem tài liệu. – SBerg413

0

Đề xuất của tôi sẽ sử dụng ListActivity.

Đó là Hoạt động có nghĩa là hiển thị các mục trong một ListView. Bạn có thể chỉ cần sử dụng một số SimpleCursorAdapter để điền chúng (cũng được minh họa trong trang JavaDoc của ListActivity).

Họ cũng đưa ra một setEmptyView()-method, có thể được sử dụng để hiển thị một View (có thể là một TextView) mà thông báo cho người dùng rằng không có hồ sơ được nêu ra và làm thế nào ông có thể tạo ra một.

Ví dụ về cách thực hiện điều đó có thể được tìm thấy here.

+0

Kính gửi Lukas Knuth, –

+1

... và phần còn lại? –

+0

Kính gửi Lukas, Hoạt động B thực sự là listActivity. Ngay cả phương thức showSubjectsOnList() được đề cập ở trên cũng là một phương thức trong Hoạt động này. Nếu con trỏ trong ShowSubjectsOnList trống, tôi muốn bắt đầu Hoạt động A, nếu không tôi muốn giữ nguyên hoạt động đó ..... Nhưng tôi không thể tìm thấy cách tìm con trỏ trống. –

1

Bạn chỉ cần sử dụng getCount(). Nếu sql của bạn đúng nhưng không trả lại bất kỳ hàng nào, bạn sẽ có đối tượng con trỏ KHÔNG null nhưng không có hàng và getCount() sẽ trả về 0.

+0

Vui lòng giải thích. –

+0

Đối tượng con trỏ luôn được trả về khi bạn truy vấn DB của mình. Nó có chuỗi truy vấn của bạn bên trong, ví dụ. Vì vậy, nó không thể được null: trong Java - định danh mà không phải là "kết nối" với bất kỳ đối tượng là null. Chỉ khi truy vấn chọn của bạn không trả về bất kỳ hàng nào - getCount() sẽ trả về 0. – Minolan

+0

Hmm..ok ... Cảm ơn bạn đã xây dựng. Nhưng làm thế nào tôi có thể giải quyết vấn đề của tôi sau đó? –

0

Tôi tin rằng vấn đề của bạn là bạn không tạo truy vấn thích hợp .

Bạn nên sử dụng truy vấn SQLiteDatabase.

Cursor c = db.query(TABLE_NAME, null, 
      null, null, null, null, null); 

Sau đó, bạn có thể sử dụng c.getCount() để xác định xem bảng có gì không.

2

Bản ghi đã xóa vẫn tồn tại trong SQLite dưới dạng bản ghi rỗng, nhưng getCount() chỉ tính không có bản ghi trống. Nếu bảng của bạn có một số bản ghi không có giá trị, một số bản ghi không rỗng sẽ có số lượng _Id lớn hơn kết quả của getCount(). Để tiếp cận chúng, bạn có thể lặp lại con trỏ (sử dụng vòng lặp for()) gấp đôi số lần so với kết quả của getCount() và sử dụng con trỏ để điền số record_Id vào một mảng. Giả sử mảng kết quả là { 1, 2, 5, 6, 7, 8, 9, 11, 12, 14 }.

Điều đó có nghĩa là các bản ghi 3, 4, 10, 13, là bản ghi không có giá trị và bảng của bạn có 14 bản ghi cùng nhau, chứ không phải 10 mà bạn nhận được từ getCount().

Hãy nhớ rằng:

  1. getCount() lợi nhuận số không ghi null,
  2. con trỏ trả về _Id số lượng không ghi null,
  3. _Id số "bỏ lỡ" của con trỏ là _Id số lượng hồ sơ null,
  4. phải đạt đủ hơn getCount() để có được tất cả.
Các vấn đề liên quan