1

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の2つの使用関数は次のとおりです。

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 は、アダプタが ListView に設定されていることですが、それは finnito です... オーバーライドされた関数 getChildrenCursor(Cursor groupCursor) が呼び出されたというログ メッセージすら表示されないので、エラーが発生する場所がわかりません...

助けて、私はこれに腹を立てています...

4

3 に答える 3

2

SimpleCursorTreeAdapter の間接的な親であるCursorTreeAdapterのドキュメントから、次のことがわかります。

カーソルには「_id」という名前の列が含まれている必要があります。含まれていない場合、このクラスは機能しません。

クエリに欠けていたもの。

于 2013-06-20T10:14:25.493 に答える
1

いくつかのポイント

空のカーソルが返される(つまり、nullを返さない)可能性があるため、c!= nullをチェックする代わりに、カーソルの列数をチェックするか、c.moveToNextチェックをチェックしてみてください。

また、すべてのrawQueryメソッドとCursorメソッドをtry {} catch(SQLiteException)でラップします。

この例外をログに記録すると、さらに多くのことが明らかになる可能性があります

于 2012-09-07T12:27:21.447 に答える
0

OK、SimpleTreeAdapter で動作させることができませんでした...単にエラーが見つかりません。ここで行ったことは、TreeAdapter をスキップしてカーソルの内容をコレクションに入力し、次に BaseExpandableListAdapter を介してリストに入力することでした。

これはより複雑で SimpleTreeAdapter ほどエレガントではありませんが、少なくとも現在は機能しています ;-)

于 2012-09-10T08:22:21.383 に答える