我目前正在使用包含三个表的数据库,每个表填充一个位于选项卡内的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)
仅供参考,当选择行时,我目前没有收到正确的项目。即,我获得了分组列表视图的位置,但在调用类别时它将其等同于未分组列表视图的位置。
提前谢谢
答案 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;
}