2012-04-20 54 views
37

Tôi đang sử dụng bộ điều hợp con trỏ mở rộng bộ điều hợp tùy chỉnh để hiển thị dữ liệu trong chế độ xem danh sách, để hiển thị số điện thoại cụ thể tôi đã chuyển id vào phương thức trong lớp cơ sở dữ liệu. đang hiển thịandroid.database.CursorIndexOutOfBoundsException: Chỉ số 0 được yêu cầu, với kích thước 0

errorandroid.database.CursorIndexOutOfBoundsException: Index 0 requested, with a size of 0 

khi đặt gỡ lỗi trong phương pháp này nó sẽ không sau khi dòng

num = cursor.getString(cursor.getColumnIndex("ContactNumber")); 

bất kỳ một thể giúp tôi để giải quyết nó. Đây là mã:

public String getNumberFromId(int id) 
{ 
    String num; 
    db= this.getReadableDatabase(); 
    Cursor cursor = db.query(scheduletable, new String[] { "ContactNumber" },"_id="+id, null, null, null, null); 
    cursor.moveToFirst(); 
    num = cursor.getString(cursor.getColumnIndex("ContactNumber")); 
    cursor.close(); 
    db.close(); 
    return num; 
} 

Trả lời

7

Kiểm tra giá trị trả về từ moveToFirst(), trước khi bạn cố gắng đọc bất cứ điều gì từ con trỏ. Có vẻ như không có kết quả nào được trả lại.

15

thử này .. này sẽ tránh được một ngoại lệ được ném ra khi con trỏ rỗng ..

if(cursor != null && cursor.moveToFirst()){ 
    num = cursor.getString(cursor.getColumnIndex("ContactNumber")); 
    cursor.close(); 
} 
+0

mã này đang hoạt động cho tôi ... Tôi đã muốn xactly điều đó. –

+2

Mã này sẽ bị lỗi trên cursor.close() nếu con trỏ là null. – Mark

+0

Có tốt không khi kiểm tra 'if (cursor.getCount()! = 0)'? –

91

Bất cứ khi nào bạn đang đối phó với Cursors, LUÔN kiểm tra cho null và kiểm tra moveToFirst() mà không thất bại.

if(cursor != null && cursor.moveToFirst()){ 
    num = cursor.getString(cursor.getColumnIndex("ContactNumber")); 
    cursor.close(); 
} 

Nơi các bản ghi một cách thích hợp để xem liệu nó đang trở lại null hoặc một con trỏ rỗng. Theo đó kiểm tra truy vấn của bạn.

Cập nhật Đặt cả hai kiểm tra trong một câu lệnh duy nhất được Jon đề cập trong nhận xét bên dưới.

Cập nhật 2 Đặt cuộc gọi close() trong phạm vi con trỏ hợp lệ.

+2

Do đánh giá lười biếng của Java về '&&', bạn chỉ có thể thực hiện 'if (cursor! = Null && cursor.moveToFirst()) {...}' –

+1

Cảm ơn bạn đã chỉ ra điều đó. cập nhật nó :) – Shubhayu

+0

Cảm ơn rất nhiều @Shubhayu Nó đã giải quyết được vấn đề của tôi. – indraja

4

phá schema để truy vấn Cursor s là

// just one 
Cursor cursor = db.query(...); 
if (cursor != null) { 
    if (cursor.moveToFirst()) { 
     value = cursor.getSomething(); 
    } 
    cursor.close(); 
} 

// multiple columns 
Cursor cursor = db.query(...); 
if (cursor != null) { 
    while (cursor.moveToNext()) { 
     values.add(cursor.getSomething()); 
    } 
    cursor.close(); 
} 
10

Đầu tiên kiểm tra Điều kiện này trước khi lấy dữ liệu

if(cursor!=null && cursor.getCount()>0){ 
    cursor.moveToFirst(); 
    num = cursor.getString(cursor.getColumnIndex("ContactNumber")); 
} 
Các vấn đề liên quan