来自数据库表的ExpandableListView

时间:2014-05-02 15:53:32

标签: android android-fragments android-sqlite expandablelistview android-cursor

我目前正在使用包含三个表的数据库,每个表填充一个位于选项卡内的ListFragment。每个ListFragment都填充了"类别"来自数据库。即我有几百个项目,但其中一些项目属于"科学"或者"历史"。 ListView对重复项进行分组,使其仅显示每个类别的一个项目。

当点击其中一个类别时,我需要重新查询数据库,从相应的表中检索行,检查"类别"列仅包含"科学"或者"历史"每个选定的类别。

这是我尝试过的。这是我的onListItemClick

    @Override
public void onListItemClick(ListView lv, View view, final int position,
                            long id){
    super.onListItemClick(lv, view, position, id);

    Cursor c = myDB.getRow(position);
    String category = c.getString(c.getColumnIndex(DataBaseHelper.KEY_CATEGORY));

    c = null;
    c = myDB.getRows(category);

    Fragment contentList = new FragmentContentList(parentListGetter(c), childListGetter(c));
    getFragmentManager().beginTransaction()
            .addToBackStack(null)
            .add(android.R.id.content, contentList)
            .commit();

}

public String[] parentListGetter(Cursor c){
    String[] parentValues = new String[]{
            c.getString(c.getColumnIndex(DataBaseHelper.KEY_REF))
    };
    return parentValues;
}

public String[][] childListGetter(Cursor c){
    String[][] childValues = new String[][]{
            {c.getString(c.getColumnIndex(DataBaseHelper.KEY_CONTENT))}
    };
    return childValues;
}

我的光标类,用于检索DataBaseHelper

中的行
    public Cursor getRows(String category){
    String where = KEY_CATEGORY + "=" + category;
    Cursor c = myDataBase.query(true, DB_TABLE, ALL_KEYS,
            where, null, null, null, null, null, null);
    if (c != null)
        c.moveToFirst();
    return c;
}

我正在努力按照https://www.youtube.com/watch?v=ys8bvCDAXxQ填充ExpandableListView 我愿意接受一种更好的方式来实现我想做的事情。根据列内容获取选择的行对我和ExpandableListView都是新的。

目前,我在调用getRows时遇到以下错误。

05-02 09:21:07.225  30967-30967/promises.scriptures.mymodule.app2 E/SQLiteLog﹕ (1) near "Covenant": syntax error
05-02 09:21:07.245  30967-30967/promises.scriptures.mymodule.app2 E/AndroidRuntime﹕ FATAL EXCEPTION: main
    Process: promises.scriptures.mymodule.app2, PID: 30967
    android.database.sqlite.SQLiteException: near "Covenant": syntax error (code 1): , while compiling: SELECT DISTINCT _id, category, reference, content FROM blessings WHERE category=Abrahamic Covenant
            at android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method)
            at android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java)
            at android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java)
            at android.database.sqlite.SQLiteSession.prepare(SQLiteSession.java)
            at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java)
            at android.database.sqlite.SQLiteQuery.<init>(SQLiteQuery.java)
            at android.database.sqlite.SQLiteDirectCursorDriver.query(SQLiteDirectCursorDriver.java)
            at android.database.sqlite.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java)
            at android.database.sqlite.SQLiteDatabase.queryWithFactory(SQLiteDatabase.java)
            at android.database.sqlite.SQLiteDatabase.query(SQLiteDatabase.java)
            at promises.scriptures.mymodule.app2.DataBaseHelper.getRows(DataBaseHelper.java:160)
            at promises.scriptures.mymodule.app2.FragmentCategoryList.onListItemClick(FragmentCategoryList.java:85)
            at android.support.v4.app.ListFragment$2.onItemClick(ListFragment.java:58)
            at android.widget.AdapterView.performItemClick(AdapterView.java)
            at android.widget.AbsListView.performItemClick(AbsListView.java)
            at android.widget.ListView.performItemClick(ListView.java)
            at android.widget.AbsListView$PerformClick.run(AbsListView.java)
            at android.widget.AbsListView$3.run(AbsListView.java)
            at android.os.Handler.handleCallback(Handler.java)
            at android.os.Handler.dispatchMessage(Handler.java)
            at android.os.Looper.loop(Looper.java)
            at android.app.ActivityThread.main(ActivityThread.java)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java)
            at de.robv.android.xposed.XposedBridge.main(XposedBridge.java:132)
            at dalvik.system.NativeStart.main(Native Method)

仅供参考,当选择行时,我目前没有收到正确的项目。即,我获得了分组列表视图的位置,但在调用类别时它将其等同于未分组列表视图的位置。

提前谢谢

1 个答案:

答案 0 :(得分:0)

使用内置的参数化查询语法。

public Cursor getRows(String category){
    String where = KEY_CATEGORY + "=?";
    Cursor c = myDataBase.query(true, DB_TABLE, ALL_KEYS,
        where, new String[] { category }, null, null, null, null, null);
    if (c != null)
        c.moveToFirst();
    return c;
}