2012-03-19 37 views
0

我有一個事件名稱和日期的數據庫。我正在嘗試使用將按事件日期分組的事件創建一個expandablelistview。ExpandableListView sqlite錯誤

我沒有找到很多與我的情況相關的信息。 SDK中的例子是使用內容提供者,但我還沒有讀取/嘗試過,並且我已經用舊的方式設置了數據庫幫助器。

我發現我認爲是一個很好的例子here並試圖使它適應我的使用,但它崩潰了,我無法弄清楚我做錯了什麼。

我的代碼

import android.app.ExpandableListActivity; 
import android.content.Context; 
import android.database.Cursor; 
import android.os.Bundle; 
import android.widget.SimpleCursorTreeAdapter; 

public class ExpandableListTestActivity extends ExpandableListActivity { 

    private AttendanceDB mDbHelper; 
    private Cursor mGroupsCursor; 
    private int mGroupIdColumnIndex; 
    private MyExpandableListAdapter mAdapter; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
        super.onCreate(savedInstanceState); 

        mDbHelper = new AttendanceDB(this); 
        mDbHelper.open(); 
        fillData(); 
    } 

    private void fillData() { 
        mGroupsCursor = mDbHelper.fetchGroup(); 
        startManagingCursor(mGroupsCursor); 

        mAdapter = new MyExpandableListAdapter(mGroupsCursor,this, 
                android.R.layout.simple_expandable_list_item_1, 
                android.R.layout.simple_expandable_list_item_1, 
                new String[] { AttendanceDB.EVENT_DATE }, 
                new int[] { android.R.id.text1 }, 
                new String[] { AttendanceDB.EVENT_NAME }, 
                new int[] { android.R.id.text1 }); 
        setListAdapter(mAdapter); 
    } 

    public class MyExpandableListAdapter extends SimpleCursorTreeAdapter { 

        public MyExpandableListAdapter(Cursor cursor, Context context, 
                int groupLayout, int childLayout, String[] groupFrom, 
                int[] groupTo, String[] childrenFrom, int[] childrenTo) { 
            super(context, cursor, groupLayout, groupFrom, groupTo, 
                    childLayout, childrenFrom, childrenTo); 
        } 

        @Override 
        protected Cursor getChildrenCursor(Cursor groupCursor) { 
            Cursor childCursor = mDbHelper 
                    .fetchChildren(groupCursor.getString(groupCursor.getColumnIndex(AttendanceDB.EVENT_DATE))); 
            startManagingCursor(childCursor); 
            return childCursor; 
        } 
    } 
} 

當我運行這段代碼,我得到如下:

E/AndroidRuntime(30329): FATAL EXCEPTION: main 
E/AndroidRuntime(30329): java.lang.RuntimeException: Unable to start activity ComponentInfo{cdc.workshopapps.explist/cdc.workshopapps.explist.ExpandableListTestActivity}: java.lang.IllegalStateException: Couldn't read row 0, col -1 from CursorWindow. Make sure the Cursor is initialized correctly before accessing data from it 
E/AndroidRuntime(30329): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1815) 
E/AndroidRuntime(30329): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1831) 
E/AndroidRuntime(30329): at android.app.ActivityThread.access$500(ActivityThread.java:122) 
E/AndroidRuntime(30329): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1024) 
E/AndroidRuntime(30329): at android.os.Handler.dispatchMessage(Handler.java:99) 
E/AndroidRuntime(30329): at android.os.Looper.loop(Looper.java:132) 
E/AndroidRuntime(30329): at android.app.ActivityThread.main(ActivityThread.java:4123) 
E/AndroidRuntime(30329): at java.lang.reflect.Method.invokeNative(Native Method) 
E/AndroidRuntime(30329): at java.lang.reflect.Method.invoke(Method.java:491) 
E/AndroidRuntime(30329): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:841) 
E/AndroidRuntime(30329): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:599) 
E/AndroidRuntime(30329): at dalvik.system.NativeStart.main(Native Method) 
E/AndroidRuntime(30329): Caused by: java.lang.IllegalStateException: Couldn't read row 0, col -1 from CursorWindow. Make sure the Cursor is initialized correctly before accessing data from it 
E/AndroidRuntime(30329): at android.database.CursorWindow.getLong_native(Native Method) 
E/AndroidRuntime(30329): at android.database.CursorWindow.getLong(CursorWindow.java:436) 
E/AndroidRuntime(30329): at android.database.AbstractWindowedCursor.getLong(AbstractWindowedCursor.java:56) 
E/AndroidRuntime(30329): at android.widget.CursorTreeAdapter$MyCursorHelper.getId(CursorTreeAdapter.java:437) 
E/AndroidRuntime(30329): at android.widget.CursorTreeAdapter.getGroupId(CursorTreeAdapter.java:192) 
E/AndroidRuntime(30329): at android.widget.ExpandableListConnector.getItemId(ExpandableListConnector.java:421) 
E/AndroidRuntime(30329): at android.widget.AdapterView.getItemIdAtPosition(AdapterView.java:744) 
E/AndroidRuntime(30329): at android.widget.AdapterView.setSelectedPositionInt(AdapterView.java:1087) 
E/AndroidRuntime(30329): at android.widget.ListView.setAdapter(ListView.java:458) 
E/AndroidRuntime(30329): at android.widget.ExpandableListView.setAdapter(ExpandableListView.java:469) 
E/AndroidRuntime(30329): at android.app.ExpandableListActivity.setListAdapter(ExpandableListActivity.java:246) 
E/AndroidRuntime(30329): at cdc.workshopapps.explist.ExpandableListTestActivity.fillData(ExpandableListTestActivity.java:36) 
E/AndroidRuntime(30329): at cdc.workshopapps.explist.ExpandableListTestActivity.onCreate(ExpandableListTestActivity.java:22) 
E/AndroidRuntime(30329): at android.app.Activity.performCreate(Activity.java:4397) 
E/AndroidRuntime(30329): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1048) 
E/AndroidRuntime(30329): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1779) 
E/AndroidRuntime(30329): ... 11 more 

我認爲此處的意思是有什麼毛病我回來在我的光標列。但是,如果我改變filldata()方法如下(只是爲了檢查我的光標/列):

mGroupsCursor = mDbHelper.fetchGroup(); 
startManagingCursor(mGroupsCursor); 
mGroupsCursor.moveToFirst(); 
String Text1 = mGroupsCursor.getString(mGroupsCursor.getColumnIndex(AttendanceDB.EVENT_DATE)); 
Toast.makeText(this, Text1, Toast.LENGTH_LONG).show(); 
Cursor childCursor = mDbHelper 
     .fetchChildren(mGroupsCursor.getString(mGroupsCursor.getColumnIndex(AttendanceDB.EVENT_DATE))); 
startManagingCursor(childCursor); 
childCursor.moveToFirst(); 
String Text2 = childCursor.getString(childCursor.getColumnIndex(AttendanceDB.EVENT_NAME)); 
Toast.makeText(this, Text2, Toast.LENGTH_LONG).show(); 

祝酒詞輸出預期的事件日期和事件名稱的數據,所以我在虧損爲我出錯了。

其他(也許)相關代碼:

public Cursor fetchGroup() { 
    String query ="SELECT DISTINCT date FROM events"; 
     return mDb.rawQuery(query,null); 
} 

public Cursor fetchChildren(String date) { 
    Cursor c = mDb.query(EVENT_TABLE, new String[] { EVENT_ROWID, 
      EVENT_NAME }, EVENT_DATE + "='" + date + "'" , 
      null, null, null, null); 

return c; 
} 

任何幫助將不勝感激。

回答

0

的CursorTreeAdapter需要遊標中的 「_id」 字段。如果你的數據庫中有這個字段,只需將它添加到你的fetchGroup和fetchChildren查詢中即可。

否則,添加「rowid as _id」。這使用SQLite內部編號的行。

Android Reference CursorTreeAdapter

+0

我會在一堆聖經上發誓,我通過這個鏈接讀了三次,並錯過了那個關於_id被要求的位。現在正在工作。現在我只需要讓它在一個片段中工作。 :p但是,如果我遇到問題,這可能是另一個問題。感謝您的協助! – Barak 2012-03-20 02:03:59

0

在從光標獲取數據之前,您必須調用cursor.moveToFirst();否則它不會被初始化。你在getChildrenCursor()函數中錯過了這個。

地址:

groupCursor.moveToFirst(); 
+0

不幸的是,沒有問題(雖然我添加了moveToFirst(),以防萬一,我還是得到了同樣的錯誤)。問題似乎是我的光標沒有列,但我確定無法找出在哪裏/如何。 – Barak 2012-03-19 19:05:54