2011-07-21 26 views
6

我有一個在Android 2.1上運行良好的應用程序,但試圖將其轉換爲3.0時,出現遊標錯誤,我不熟悉它。Android 3.0無法從光標窗口讀取行#,列#

Java.lang.IllegalStateException:無法讀取ROW0,柱-1從 光標窗口。確保光標在 從其訪問數據之前正確初始化。

所有的數據都存儲在SQLite數據庫中,並且此代碼在Android 2.1中正常工作。在android 3.0中,遊標是否有不同的初始化?

以下是我的代碼。

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(); 
     } 
} 

回答

1

好吧我想通了。出於某種原因,當我的遊標移動並獲取字段的列索引時,試圖將我的應用程序轉換爲3.0,在這種情況下(「groupid」),它將返回值-1。當遊標嘗試從-1開始時,它會崩潰,因爲它無法在行(0),列(-1)處找到記錄。所以我的解決方法是在獲取標識時只添加一個到列索引。見下文。

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

通過在列索引中加1,它似乎解決了問題。

+0

我有完全相同的問題,並修復它 - 謝謝! +1 – Matt

2

今天早些時候我遇到了同樣的錯誤信息。結果是,我在列名中輸入了一個錯字。所以,如果它仍然適用,你可以去檢查列名錯字的。請注意,它的大小寫也是。對我來說錯誤是:

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

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

您可以嘗試使用public static final String ARTICLE_NUMBER =「articleNumber」並始終指向該值。所以如果你有一個名爲DBConstants的類,你可以這樣做:c.getColumnIndex(DBConstants.ARTICLE_NUMBER)。這樣你永遠不會得到錯別字:) – DecodeGnome

1

如果getColumnIndex返回-1,那麼該列不存在。 Otherwize它返回從零開始的列索引。

+0

是它的正確。我的列名稱是「名稱」,但是以getColumnIndex(「Name」)的形式訪問。將名稱更改爲名稱後,工作 – Senthil

1

-1是每個sqlite表應該具有android框架所要求的_id列。如果您必須在索引中添加+1,您會在某處出錯。

0

如果找不到'columnName',則-1值將返回表單getColumnIndex(columnName)。檢查列名

相關問題