2016-04-16 135 views
0

我試着在我的SQLite數據庫來創建數據的achartengine條形圖,但是當我試圖來填充條形圖我得到以下錯誤的數據集:achartengine條形圖

Caused by: java.lang.IllegalStateException: Couldn't read row 1, col 1 from CursorWindow. Make sure the Cursor is initialized correctly before accessing data from it. 

TestAdapter的.java

public Cursor getDaysGraphDataY() 
{ 
    try 
    { 
     String sql ="SELECT data FROM v_data_main WHERE datatype = 'd' ORDER BY CAST(number AS INTEGER) DESC"; 

     Cursor mCur = mDb.rawQuery(sql, null); 
     if (mCur!=null) 
     { 
      mCur.moveToNext(); 
     } 
     return mCur; 
    } 
    catch (SQLException mSQLException) 
    { 
     Log.e(TAG, "getDaysGraphDataY >>"+ mSQLException.toString()); 
     throw mSQLException; 
    } 
} 

public Cursor getDaysGraphDataX() 
{ 
    try 
    { 
     String sql ="SELECT number FROM v_data_main WHERE datatype = 'd' ORDER BY CAST(number AS INTEGER) DESC"; 

     Cursor mCur = mDb.rawQuery(sql, null); 
     if (mCur!=null) 
     { 
      mCur.moveToNext(); 
     } 
     return mCur; 
    } 
    catch (SQLException mSQLException) 
    { 
     Log.e(TAG, "getDaysGraphDataX >>"+ mSQLException.toString()); 
     throw mSQLException; 
    } 
} 

BarChart.java

public class BarGraph{ 

public Intent getIntent(Context context) 
{ 
    // Bar 1 
    //int[] y = { 124, 135, 443, 456, 234, 123, 342, 134, 123, 643, 234, 274 }; 
    //context = context.getApplicationContext(); 
    TestAdapter mDbHelper = new TestAdapter(context); 
    mDbHelper.createDatabase(); 
    mDbHelper.open(); 

    Cursor getDataY = mDbHelper.getDaysGraphDataY(); 
    Cursor getDataX = mDbHelper.getDaysGraphDataX(); 

    int rowsY = getDataY.getCount(); 
    int rowsX = getDataX.getCount(); 

    getDataY.moveToFirst(); 
    getDataX.moveToFirst(); 

    CategorySeries series = new CategorySeries("Demo Bar Graph 1"); 
    for (int i = 0; i < rowsY; i++) { 
     series.add(getDataX.getString(i), getDataY.getInt(i)); 
     getDataY.moveToNext(); 
     getDataX.moveToNext(); 
    } 
    mDbHelper.close(); 
    /* 
    // Bar 2 
    int[] y2 = { 224, 235, 243, 256, 234, 223, 242, 234, 223, 243, 234, 274 }; 
    CategorySeries series2 = new CategorySeries("Demo Bar Graph 2"); 
    for (int i = 0; i < y.length; i++) { 
     series2.add("Bar " + (i+1), y2[i]); 
    } 
    */ 

    XYMultipleSeriesDataset dataset = new XYMultipleSeriesDataset(); 
    dataset.addSeries(series.toXYSeries()); 
    //dataset.addSeries(series2.toXYSeries()); 

    // This is how the "Graph" itself will look like 
    XYMultipleSeriesRenderer mRenderer = new XYMultipleSeriesRenderer(); 
    mRenderer.setChartTitle("Demo Graph Title"); 
    mRenderer.setXTitle("X VALUES"); 
    mRenderer.setYTitle("Y VALUES"); 
    mRenderer.setAxesColor(Color.GREEN); 
    mRenderer.setLabelsColor(Color.RED); 
    // Customize bar 1 
    XYSeriesRenderer renderer = new XYSeriesRenderer(); 
    renderer.setDisplayChartValues(true); 
    renderer.setChartValuesSpacing((float) 0.5); 
    mRenderer.addSeriesRenderer(renderer); 
    // Customize bar 2 
    XYSeriesRenderer renderer2 = new XYSeriesRenderer(); 
    renderer.setColor(Color.CYAN); 
    renderer.setDisplayChartValues(true); 
    renderer.setChartValuesSpacing((float) 0.5); 
    mRenderer.addSeriesRenderer(renderer2); 

    Intent intent = ChartFactory.getBarChartIntent(context, dataset,mRenderer, Type.DEFAULT); 
    return intent; 
} 

}

我試着添加一個_id列,如另一個問題中所建議的,也卸載應用程序並重新安裝。

以下是完整的logcat的:

04-16 17:38:23.625 3334-3334/? E/CursorWindow: Failed to read row 1, column 1 from a CursorWindow which has 30 rows, 1 columns. 
04-16 17:38:23.629 3334-3334/? D/AndroidRuntime: Shutting down VM 
04-16 17:38:23.630 3334-3334/? E/AndroidRuntime: FATAL EXCEPTION: main 
               Process: com.marnistek.serverstats, PID: 3334 
               java.lang.IllegalStateException: Could not execute method for android:onClick 
                at android.view.View$DeclaredOnClickListener.onClick(View.java:4452) 
                at android.view.View.performClick(View.java:5198) 
                at android.view.View$PerformClick.run(View.java:21147) 
                at android.os.Handler.handleCallback(Handler.java:739) 
                at android.os.Handler.dispatchMessage(Handler.java:95) 
                at android.os.Looper.loop(Looper.java:148) 
                at android.app.ActivityThread.main(ActivityThread.java:5417) 
                at java.lang.reflect.Method.invoke(Native Method) 
                at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 
                at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 
                Caused by: java.lang.reflect.InvocationTargetException 
                at java.lang.reflect.Method.invoke(Native Method) 
                at android.view.View$DeclaredOnClickListener.onClick(View.java:4447) 
                at android.view.View.performClick(View.java:5198)  
                at android.view.View$PerformClick.run(View.java:21147)  
                at android.os.Handler.handleCallback(Handler.java:739)  
                at android.os.Handler.dispatchMessage(Handler.java:95)  
                at android.os.Looper.loop(Looper.java:148)  
                at android.app.ActivityThread.main(ActivityThread.java:5417)  
                at java.lang.reflect.Method.invoke(Native Method)  
                at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)  
                at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)  
                Caused by: java.lang.IllegalStateException: Couldn't read row 1, col 1 from CursorWindow. Make sure the Cursor is initialized correctly before accessing data from it. 
                at android.database.CursorWindow.nativeGetString(Native Method) 
                at android.database.CursorWindow.getString(CursorWindow.java:438) 
                at android.database.AbstractWindowedCursor.getString(AbstractWindowedCursor.java:51) 
                at com.marnistek.serverstats.BarGraph.getIntent(BarGraph.java:36) 
                at com.marnistek.serverstats.GraphAChartEngineActivity.barGraphHandler(GraphAChartEngineActivity.java:27) 
                at java.lang.reflect.Method.invoke(Native Method)  
                at android.view.View$DeclaredOnClickListener.onClick(View.java:4447)  
                at android.view.View.performClick(View.java:5198)  
                at android.view.View$PerformClick.run(View.java:21147)  
                at android.os.Handler.handleCallback(Handler.java:739)  
                at android.os.Handler.dispatchMessage(Handler.java:95)  
                at android.os.Looper.loop(Looper.java:148)  
                at android.app.ActivityThread.main(ActivityThread.java:5417)  
                at java.lang.reflect.Method.invoke(Native Method)  
                at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)  
                at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)  

任何幫助將非常感激。

回答

0

我把它從改變我的循環工作:

for (int i = 0; i < rowsY; i++) { 
    series.add(getDataX.getString(i), getDataY.getInt(i)); 
    getDataY.moveToNext(); 
    getDataX.moveToNext(); 
} 

要:

for (int i = 0; i < rows; i++) { 
     series.add(getData.getString(getData.getColumnIndex("number")), getData.getInt(getData.getColumnIndex("data"))); 
     getData.moveToPosition(i); 
    } 

我也改成了只需使用一個遊標從db獲取所需的所有列,而不是爲每個X和Y a分別指定一個遊標xes

1

這些異常在嘗試從Cursor中獲取原始值(int,long)時發生。不幸的是,這兩個例外都沒有解釋這個問題到底是什麼。同樣重要的是,這些例外與任何特定的Android API版本無關,也不與特定的設備製造商相關。

請點擊此鏈接瞭解詳情:
http://blog.tapreason.com/2014/03/02/how-to-resolve-java-lang-illegalstateexception-couldnt-read-row-0-col-y-from-cursorwindow-make-sure-the-cursor-is-initialized-correctly-before-accessing-data-from-it/