我想从SQLite数据库中获取数据,并通过SimpleCursorTreeAdapter填充ExpandableListView,但是在某种程度上失败了。我真的找不到问题所在,甚至不知道异常发生在哪里...
MyExpandableListAdapter:
private class MyExpandableListAdapter extends SimpleCursorTreeAdapter
{
public MyExpandableListAdapter(Context context, Cursor cursor,
int groupLayout, String[] groupFrom, int[] groupTo,
int childLayout, String[] childFrom, int[] childTo) {
super(context, cursor, groupLayout, groupFrom, groupTo, childLayout, childFrom,
childTo);
// TODO Auto-generated constructor stub
}
@Override
protected Cursor getChildrenCursor(Cursor groupCursor) {
Log.d("Calling getChildrenCursor()","OK");
Cursor childrenCursor = dbAdapter.getTrackedValuesByDate(groupCursor.getString(groupCursor.getColumnIndex(DbAdapter.KEY_VALUE_DATE)));
Log.d("getChildrenCursor()", DatabaseUtils.dumpCursorToString(childrenCursor));
startManagingCursor(childrenCursor);
return childrenCursor;
}
}
这是我设置ListAdapter的活动中的相关部分:
private void fillData()
{
Cursor dateCursor = dbAdapter.getAllDates();
startManagingCursor(dateCursor);
Log.d("fillData()", DatabaseUtils.dumpCursorToString(dateCursor));
MyExpandableListAdapter myAdapter = new MyExpandableListAdapter(this,
dateCursor,
R.layout.expandablelist_header_date,
new String[] {DbAdapter.KEY_VALUE_DATE},
new int[]{R.id.expandablelist_header_date},
R.layout.listview_tracked_values,
new String[] {DbAdapter.KEY_INDICATOR_NAME, DbAdapter.KEY_INDICATOR_UNIT, DbAdapter.KEY_VALUE_VALUE},
new int[]{R.id.list_trackedvalue_indicatorname, R.id.list_trackedvalue_unit, R.id.list_trackedvalue_value });
Log.d("fillData()", "Creation successful");
this.expandableList.setAdapter(myAdapter);
Log.d("fillData()", "Adapter set");
}
这是我的dbAdapter的两个使用的功能:
public Cursor getTrackedValuesByDate(String dateString)
{
Cursor cursor = this.db.rawQuery("select * from "+DB_INDICATORS_TABLE+" i,"+ DB_VALUES_TABLE+" v where i."
+ KEY_INDICATOR_ROWID+"=v."+KEY_VALUE_INDICATOR_ID+" and v."+KEY_VALUE_DATE+"='"+dateString+"'", null);
if(cursor!=null)
cursor.moveToFirst();
Log.d("getTrackedValuesByDate()", DatabaseUtils.dumpCursorToString(cursor));
return cursor;
}
public Cursor getAllDates()
{
Cursor c = this.db.rawQuery("Select distinct "+KEY_VALUE_DATE+" from "+DB_VALUES_TABLE, null);
if(c!=null)
c.moveToFirst();
Log.d("getAllDates()", DatabaseUtils.dumpCursorToString(c));
return c;
}
最后是LogCat的输出:
09-07 12:05:06.912: D/fillData()(1317): >>>>> Dumping cursor android.database.sqlite.SQLiteCursor@41219990
09-07 12:05:06.912: D/fillData()(1317): 0 {
09-07 12:05:06.912: D/fillData()(1317): trackDate=07.09.2012
09-07 12:05:06.912: D/fillData()(1317): }
09-07 12:05:06.912: D/fillData()(1317): 1 {
09-07 12:05:06.912: D/fillData()(1317): trackDate=08.08.2012
09-07 12:05:06.912: D/fillData()(1317): }
09-07 12:05:06.912: D/fillData()(1317): <<<<<
09-07 12:05:06.952: D/fillData()(1317): Creation successful
09-07 12:05:06.952: D/fillData()(1317): Adapter set
09-07 12:05:07.012: E/CursorWindow(1317): Failed to read row 0, column -1 from a CursorWindow which has 2 rows, 1 columns.
09-07 12:05:07.012: D/AndroidRuntime(1317): Shutting down VM
09-07 12:05:07.048: W/dalvikvm(1317): threadid=1: thread exiting with uncaught exception (group=0x40a13300)
09-07 12:05:07.145: E/AndroidRuntime(1317): FATAL EXCEPTION: main
09-07 12:05:07.145: E/AndroidRuntime(1317): java.lang.IllegalStateException: Couldn't read row 0, col -1 from CursorWindow. Make sure the Cursor is initialized correctly before accessing data from it.
09-07 12:05:07.145: E/AndroidRuntime(1317): at android.database.CursorWindow.nativeGetLong(Native Method)
09-07 12:05:07.145: E/AndroidRuntime(1317): at android.database.CursorWindow.getLong(CursorWindow.java:507)
09-07 12:05:07.145: E/AndroidRuntime(1317): at android.database.AbstractWindowedCursor.getLong(AbstractWindowedCursor.java:75)
09-07 12:05:07.145: E/AndroidRuntime(1317): at android.widget.CursorTreeAdapter$MyCursorHelper.getId(CursorTreeAdapter.java:436)
09-07 12:05:07.145: E/AndroidRuntime(1317): at android.widget.CursorTreeAdapter.getGroupId(CursorTreeAdapter.java:191)
09-07 12:05:07.145: E/AndroidRuntime(1317): at android.widget.ExpandableListConnector.getItemId(ExpandableListConnector.java:422)
09-07 12:05:07.145: E/AndroidRuntime(1317): at android.widget.AbsListView.obtainView(AbsListView.java:2288)
09-07 12:05:07.145: E/AndroidRuntime(1317): at android.widget.ListView.measureHeightOfChildren(ListView.java:1244)
09-07 12:05:07.145: E/AndroidRuntime(1317): at android.widget.ListView.onMeasure(ListView.java:1156)
09-07 12:05:07.145: E/AndroidRuntime(1317): at android.view.View.measure(View.java:15172)
09-07 12:05:07.145: E/AndroidRuntime(1317): at android.widget.RelativeLayout.measureChild(RelativeLayout.java:602)
09-07 12:05:07.145: E/AndroidRuntime(1317): at android.widget.RelativeLayout.onMeasure(RelativeLayout.java:415)
09-07 12:05:07.145: E/AndroidRuntime(1317): at android.view.View.measure(View.java:15172)
09-07 12:05:07.145: E/AndroidRuntime(1317): at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4814)
09-07 12:05:07.145: E/AndroidRuntime(1317): at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)
09-07 12:05:07.145: E/AndroidRuntime(1317): at android.view.View.measure(View.java:15172)
如您所见,我的最后一个debug.log是Adapter设置为ListView,但是
这是finnito ...
我什至没有收到一条消息,即曾经调用过重写函数getChildrenCursor(Cursor groupCursor),所以错误发生在我不知道的地方...
救命,我为此而生气...
最佳答案
从CursorTreeAdapter的文档中,它是SimpleCursorTreeAdapter的间接父级,您可以看到:
游标必须包含一个名为“ _id”的列,否则此类将无法使用。
您的查询中缺少的内容。