2012-06-29 31 views
6

Tôi đang cố gắng lấy văn bản từ một hàng nhất định của cơ sở dữ liệu của mình. Đối với điều này, tôi đã thực hiện chức năng nàyChỉ số CursorIndexOutOfBoundsException 0 được yêu cầu, với kích thước 0

public String getTranslation(long rowId) throws SQLException {  
    String str = null; 
    Cursor mCursor = db.query(
     true, TABLE_LANGUAGE_FR, new String[] { 
      KEY_ID_INTERFACE_TEXT, KEY_ITEM_NAME,KEY_FORM_LABEL_ID, KEY_FORM_RANK 
     }, 
     KEY_FORM_LABEL_ID + "=" + rowId, null, null, null, null, null 
    ); 

    if (mCursor != null) { 
     mCursor.moveToFirst(); 
     str = mCursor.getString(mCursor.getColumnIndex(KEY_ITEM_NAME)); 
    } 
    return str; 
} 

và tôi gọi nó là như thế này:

db = new DbAdapter(this); 
db.createDatabase(); 
db.openDataBase(); 
String str = db.getTranslation(1706); 

bảng của tôi trông như thế này:

enter image description here

tôi nhận được lỗi này:

09:32:08.965 307 com.Orange ERROR AndroidRuntime Caused by: android.database.CursorIndexOutOfBoundsException: Index 0 requested, with a size of 0 
09:32:08.965 307 com.Orange ERROR AndroidRuntime  at android.database.AbstractCursor.checkPosition(AbstractCursor.java:580) 
09:32:08.965 307 com.Orange ERROR AndroidRuntime  at android.database.AbstractWindowedCursor.checkPosition(AbstractWindowedCursor.java:214) 
09:32:08.965 307 com.Orange ERROR AndroidRuntime  at android.database.AbstractWindowedCursor.getString(AbstractWindowedCursor.java:41) 
09:32:08.965 307 com.Orange ERROR AndroidRuntime  at com.Orange.Database.DbAdapter.getTranslation(DbAdapter.java:141) 
09:32:08.965 307 com.Orange ERROR AndroidRuntime  at com.Orange.Authentication.onCreate(Authentication.java:32) 

Tại sao tôi nhận được lỗi này? Tôi làm gì sai ở đây?

Xin cảm ơn trước.

+0

Vui lòng chấp nhận câu trả lời nếu bạn có giải pháp của mình :) –

Trả lời

25

Dường như bạn có con trỏ con trỏ. Thay vì kiểm tra xem có vô hiệu không, hãy thử kiểm tra

if(mCursor.getCount() > 0) 
{ 
    //do stuff 
} 

thử xóa điều kiện của bạn để đảm bảo bạn thực sự nhận dữ liệu khi chạy câu lệnh chọn. Nếu bạn vẫn không nhận được gì, bạn có thể có lỗi đánh máy trong tablenames của mình hoặc không thể kết nối/tạo cơ sở dữ liệu/bảng.

Cursor mCursor = db.query("sys_interface_text", new String[] { 
     "id_interface_text", "item_name","form_label_id", "form_rank"}, 
       "form_label_id = 1706", null, null, null, 
     null); 
+0

Tôi đặt điều kiện này và tôi thấy rằng con trỏ của tôi là 0, nhưng tôi không hiểu tại sao. – Gabrielle

+0

Đọc câu trả lời của Khan, db của bạn. truy vấn không khớp với cú pháp được mô tả tại http://developer.android.com/reference/android/database/sqlite/SQLiteQueryBuilder.html xoá "true" khỏi các tham số có thể thực hiện thủ thuật – KristianMedK

+0

Tôi đã thay đổi truy vấn của mình là Khan cho biết , nhưng vẫn còn cùng một vấn đề. – Gabrielle

0

thử bằng cách thay đổi dòng này

Cursor mCursor = db.query(true, TABLE_LANGUAGE_FR, new String[] { 
      KEY_ID_INTERFACE_TEXT, KEY_ITEM_NAME,KEY_FORM_LABEL_ID, KEY_FORM_RANK}, 
        KEY_FORM_LABEL_ID + "=" + rowId, null, null, null, 
      null, null); 

bởi

Cursor mCursor = db.query(TABLE_LANGUAGE_FR, new String[] { 
      KEY_ID_INTERFACE_TEXT, KEY_ITEM_NAME,KEY_FORM_LABEL_ID, KEY_FORM_RANK}, 
        KEY_FORM_LABEL_ID + "=" + rowId, null, null, null, 
      null); 

và cũng thêm này trong điều kiện nếu

return str; 
+0

Tôi có cùng một lỗi, không có gì thay đổi. – Gabrielle

+0

một kiểm tra plz hơn nữa tên cột ur và tablename phải giống như trong cơ sở dữ liệu không có bất kỳ lỗi chính tả nào, điều này có thể gây ra sự cố – Khan

+0

loại cột KEY_FORM_LABEL_ID là – Khan

1

Hãy thử sử dụng

while(cursor.moveToNext()) 
{ 
    if(cursor.isFirst()) 
    { 
     //Your code goes here in your case 
     return mCursor.getString(mCursor.getColumnIndex(KEY_ITEM_NAME)); 
    } 
} 
finaly 
{ 
if(mCursor!= null) 
{ 
    mCursor.close(); 
} 
} 
Các vấn đề liên quan