我正在尝试移动并显示下一个查询结果,我看到的示例引用了count = 1或获取所有记录,但无法确定它们是如何实现的。
我能够显示第一个记录正常,但在尝试moveToNext
时,我最终得到了结果,moveToPrev
什么也没做。 (我猜这与我读过的计数变量有关)
DBHelper.Java
public Cursor PL_get_Record(String pldescription, SQLiteDatabase sqlitedatabase) {
String selection = PLDESCRIPTION + " LIKE ?";
String[] selection_args = {
"%" + pldescription + "%"
};
Cursor c = sqlitedatabase.query(PLTABLE_NAME, PL_All_Cols, selection, selection_args, null, null, null);
return c;
}
MainActivity.Java - MoveToNext按钮
public void btn_ParamNext(View view) {
dbhelper = new DbHelper(getApplicationContext());
sqlitedatabase = dbhelper.getReadableDatabase();
Cursor c = dbhelper.get_Record(Desc, sqlitedatabase);
while (c.moveToNext()) {
DisplayData(c);
}
c.close();
}
MainActivity.Java - MoveToPrevious按钮
public void ParamPrev(View view) {
dbhelper = new DbHelper(getApplicationContext());
sqlitedatabase = dbhelper.getReadableDatabase();
Cursor c = dbhelper.get_Record(Desc, sqlitedatabase);
while (c.moveToPrevious()) {
DisplayData(c);
}
c.close();
}
我见过的其他例子引用了RawQuery,我已经热情地开始工作了。
非常感谢任何帮助或示例。
[编辑]
@Frank,谢谢你的回复。我已经尝试过你的建议,但我显然没有正确理解,我的代码现在如下。
DbHelper.java
public Cursor PL_get_Record (String pldescription, SQLiteDatabase sqlitedatabase) {
String selection = PLDESCRIPTION+" LIKE ?";
String [] selection_args = {"%"+pldescription+"%"};
Cursor cursor = sqlitedatabase.query(PLTABLE_NAME, PL_All_Cols, selection, selection_args, null, null, null);
return cursor; }
OnClickListener with btnFirstRec,btnNext& btnPrev按钮
private View.OnClickListener onClickListener = new View.OnClickListener() {
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btnFirstRec:
dbhelper = new DbHelper(getApplicationContext());
sqlitedatabase = dbhelper.getReadableDatabase();
Cursor c = dbhelper.PL_get_Record(Desc, sqlitedatabase);
if (c != null) {
c.moveToFirst();
DisplayData(c);
}
break;
case R.id.btnNext:
if (c != null && !c.isAfterLast()) {
c.moveToNext();
DisplayData(c);
}
break;
case R.id.btnPrev:
if (c != null && !c.isBeforeFirst()) {
c.moveToPrevious();
DisplayData(c);
}
break;
}
}
};
我现在收到错误
Variable c might not have been initialized
如果我将btnNext和btnPrev更改为
dbhelper = new DbHelper(getApplicationContext());
sqlitedatabase = dbhelper.getReadableDatabase();
Cursor c = dbhelper.PL_get_Record(Desc, sqlitedatabase);
if (c != null && !c.isAfterLast()) {
c.moveToNext();
DisplayData(c);
}
break;
我最终得到了
variable c is already defined in method onClick(View)
不确定还有什么可以尝试,请帮忙。
答案 0 :(得分:1)
问题是你正在浏览记录。
如果您在第一条记录上(当您检索记录集您不是时,直到您转到第一条或下一条记录),那么您将循环到最后一条记录并且只获得最后一次显示。
如果您在第一条记录上(并且当您检索记录集您不是时,直到您移动到第一条记录或下一条记录),那么您将在第一次记录时停止,因为你不能在第一张唱片之前移动。
我要做的是重写你的按钮点击监听器,一旦你拿到光标就可以上下移动一个位置。
所以,让我们说tou像这样检索光标:
// You have to change your dbhelper method name to match - atually there's an extra "PL_"
Cursor c = dbhelper.get_Record(Desc, sqlitedatabase);
if (c != null)
{
c.moveToFirst(); // position on the first record, as soon as you get the cursor
}
然后在你的点击听众中简单地做(btnNext)
if (c != null && !c.isAfterLast)
{
c.moveToNext()
}
或(btnPRev)
if (c != null && !c.isBeforeFirst)
{
c.moveToPrevious()
}
足够。
<强> [编辑] 强>
您编辑了自己的问题,但我发现您完全不理解我的回答 您必须将光标移到Click侦听器外面。
这就是你得到variable c is already defined in method onClick(View)
所以,移动这部分
dbhelper = new DbHelper(getApplicationContext());
sqlitedatabase = dbhelper.getReadableDatabase();
Cursor c = dbhelper.PL_get_Record(Desc, sqlitedatabase);
在onClick()
方法之前。
此外,您可以移动
行DisplayData(c);
在switch()
之后,而不是在所有情况下都重复它 无论如何它必须被执行。