2011-07-21 8 views
6

Tôi có một ứng dụng chạy tốt trên Android 2.1, nhưng khi cố gắng chuyển đổi sang 3.0, tôi gặp lỗi con trỏ mà tôi không quen với.Android 3.0 Không thể đọc hàng #, cột # từ cửa sổ con trỏ

Java.lang.IllegalStateException: Không thể đọc row0, cột -1 từ cửa sổ con trỏ. Đảm bảo con trỏ được khởi chạy chính xác trước khi truy cập dữ liệu từ con trỏ.

Tất cả dữ liệu được storred trong cơ sở dữ liệu SQLite và mã này hoạt động tốt trong Android 2.1. Con trỏ có phải được khởi tạo khác trong Android 3.0 không?

Được liệt kê bên dưới là mã của tôi.

private void OpenGroupData(){ 
SQLiteDatabase db = openOrCreateDatabase(DATABASE_NAME,Context.MODE_PRIVATE,null); 
Cursor cur = db.rawQuery("SELECT groupid FROM properties GROUP BY GroupID" + ";" , null); 
LinearLayout glayout = (LinearLayout) findViewById(R.id.Grouplayout); 
LinearLayout gwindow = (LinearLayout) findViewById(R.id.groupwindow); 

TextView data = new TextView(this); 
glayout.addView(data); 
data.setText(""); 
int ID = cur.getColumnIndex("groupid"); 
int idvalue; 

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_USER); 

try{ 
    // Check if our result was valid. 
    cur.moveToFirst(); 
    if (cur != null) { 

     // Loop through all Results 
     do {data = new TextView(this); 
      data.setTextSize(20); 
     data.setClickable(true); 
     data.setOnClickListener(new OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       GroupClick(v); 
      } 
      }); 
     glayout.addView(data); 
     idvalue = cur.getInt(ID); 
     data.setId(idvalue); 
     data.setText("Group: " + idvalue); 
     }while(cur.moveToNext()); 
     } 
     cur.close(); 
     db.close(); 
     } catch(Exception e) { 
      Toast.makeText(getApplicationContext(), "Open Group Exception: " + e.toString(), Toast.LENGTH_SHORT).show(); 
     } 
} 

Trả lời

1

Được rồi tôi đã tìm ra. Đối với một số lý do khi cố gắng transistion ứng dụng của tôi đến 3.0 khi con trỏ của tôi đi và lấy chỉ mục cột cho một trường, trong trường hợp này ("groupid"), nó trả về giá trị -1. Khi con trỏ cố gắng bắt đầu ở -1 nó bị treo vì nó không thể tìm thấy bản ghi ở hàng (0), cột (-1). Vì vậy, sửa chữa của tôi là chỉ cần thêm một đến chỉ số cột khi nhận được id. xem bên dưới.

int ID = cur.getColumnIndex("groupid") + 1; 
int idvalue; 

Bằng cách thêm 1 vào chỉ mục Cột, dường như đã giải quyết được sự cố.

+0

Tôi đã gặp sự cố tương tự và điều này đã khắc phục sự cố - cảm ơn bạn! +1 – Matt

2

Tôi đã chạy vào cùng một thông báo lỗi vào đầu ngày này. Tất cả nó bật ra là tôi đã thực hiện một lỗi đánh máy trong tên cột. Vì vậy, nếu nó vẫn áp dụng, bạn có thể đi và kiểm tra tên cột cho typo của. Lưu ý rằng trường hợp của nó nhạy cảm là tốt. Lỗi cho tôi nằm dọc theo dòng:

//Trew error 
c.getColumnIndex("ArticleNumber"); 

//Was correct 
c.getColumnIndex("Articlenumber"); 
+1

Bạn có thể thử sử dụng chuỗi cuối cùng tĩnh công khai ARTICLE_NUMBER = "articleNumber" và luôn trỏ vào giá trị đó. Vì vậy, nếu bạn có trong một lớp được gọi là DBConstants, bạn làm một cái gì đó như thế này: c.getColumnIndex (DBConstants.ARTICLE_NUMBER). Bằng cách này bạn sẽ không bao giờ nhận được lỗi chính tả :) – DecodeGnome

1

Nếu getColumnIndex trả về -1, thì cột đó không tồn tại. Otherwize nó trả về chỉ số cột dựa trên zero.

+0

có chính xác của nó. tên cột của tôi là "name" nhưng được truy cập dưới dạng getColumnIndex ("Name"). sau khi đổi tên thành tên, đã làm việc – Senthil

1

-1 là cột _id mà mỗi bảng sqlite phải có như được yêu cầu bởi khung android. Nếu bạn phải thêm +1 vào chỉ mục, bạn đang đi sai ở đâu đó.

0

Giá trị trả về -1 biểu mẫu getColumnIndex (columnName) nếu không tìm thấy 'columnName'. Kiểm tra các tên cột