2012-09-16 39 views
16

Tôi là một newbie lập trình là gì và tôi thấy đoạn mã này trong internet và nó hoạt động tốtViệc sử dụng moveToFirst() trong SQLite Cursors

Cursor c=db.query(DataBase.TB_NAME, new String[] {DataBase.KEY_ROWID,DataBase.KEY_RATE}, DataBase.KEY_ROWID+"= 1", null, null, null, null); 
     if(c!=null) 
     { 
      c.moveToFirst(); 
     } 

nhưng tôi không thể hiểu được việc sử dụng của

if(c!=null) 
    { 
     c.moveToFirst(); 
    } 

một phần. Chính xác là gì và nếu tôi xóa

if(c!=null) { c.moveToFirst(); } 

một phần, mã không hoạt động.

Trả lời

50

Các tài liệu cho SQLiteDatabase.query() nói rằng các phương pháp truy vấn trở lại: "Một đối tượng Cursor, đó là vị trí trước sự xâm nhập đầu tiên"

Gọi số moveToFirst() thực hiện hai điều: nó cho phép bạn kiểm tra xem truy vấn có trả về một tập rỗng (bằng cách kiểm tra giá trị trả về) và nó di chuyển con trỏ đến kết quả đầu tiên (khi bộ không trống). Lưu ý rằng để bảo vệ chống lại tập hợp trả về trống, mã bạn đã đăng phải kiểm tra giá trị trả về (mà nó không hoạt động).

Không giống như cuộc gọi đến moveToFirst(), kiểm tra cho if(c!=null) là vô ích; query() sẽ trả lại đối tượng Cursor hoặc nó sẽ ném một ngoại lệ. Nó sẽ không bao giờ trả về null.

+0

tuyệt vời, cảm ơn cũng cho tôi biết cách làm việc của 'if (c! = Null)' – Aswin

+2

@Aswin - Xong. Thử nghiệm cho 'null' là vô dụng. Bạn có thể di chuyển cuộc gọi đến 'moveToFirst()' bên ngoài 'if' và thoát khỏi' if'. –

+0

Giải thích tốt cho con trỏ và xử lý lỗi của nó – Zoombie

0

Con trỏ không phải là Hàng của kết quả truy vấn. Con trỏ là một đối tượng có thể lặp trên hàng kết quả truy vấn của bạn. Con trỏ có thể di chuyển đến mỗi hàng. Phương pháp .moveToFirst() di chuyển nó sang hàng đầu tiên của bảng kết quả.

8
if (c.moveToFirst()) { 
    while(!c.isAfterLast()) { // If you use c.moveToNext() here, you will bypass the first row, which is WRONG 
    ... 
    c.moveToNext(); 
    } 
} 
-1

những gì macio.Jun nói là đúng!

chúng tôi có mã như dưới đây:

String sql = "select id,title,url,singer,view,info from cache where id=" + id; 
    SQLiteDatabase db = getMaintainer().getReadableDatabase(); 
    Cursor query = db.rawQuery(sql, null); 
    query.moveToFirst(); 
    while(query.moveToNext()){ 
     DBMusicData entity = new DBMusicData(); 
     entity.setId(query.getString(query.getColumnIndex(FIELD_ID))); 
     entity.setTitle(query.getString(query.getColumnIndex(FIELD_TITLE))); 
     entity.setSinger(query.getString(query.getColumnIndex(FIELD_SINGER))); 
     entity.setTitlepic(query.getString(query.getColumnIndex(FIELD_PICURL))); 
     entity.setInfoUrl(query.getString(query.getColumnIndex(FIELD_INFO))); 
     entity.setViews(query.getString(query.getColumnIndex(FIELD_VIEW))); 
     Log.w(tag, "cache:"+ entity.toString()); 
    } 
    query.close(); 
    query=null; 
    db.close(); 
    db=null; 

Nếu chúng ta chỉ có một bản ghi trong bảng cache, query.moveToFirst(); sẽ khiến không có bản ghi nào trả về.

+0

Vui lòng kiểm tra lỗi logic: Nếu cursor.moveToNext trả về true, thì bạn đang ở trên bản ghi đầu tiên. Gọi moveToNext sẽ bỏ qua hàng đầu tiên của bạn đến hàng tiếp theo và hàng đầu tiên của bạn sẽ không bao giờ được truy cập. Sau khi bạn kiểm tra rằng moveToFirst trả về true, vòng lặp while của bạn sẽ là một vòng lặp do {} while() thay vì trong khi vòng lặp. –

0

phương thức moveToFirst() di chuyển con trỏ đến hàng đầu tiên. Nó cho phép thực hiện kiểm tra xem truy vấn có trả lại một tập rỗng hay không. Dưới đây là ví dụ về việc triển khai,

if (cursor.getCount() == 0 || !cursor.moveToFirst()) { 

return cursor.getLong(cursor.getColumnIndexOrThrow(ID_COLUMN)); 

cursor.close(); 
Các vấn đề liên quan