然后按下Next和Previous按钮显示记录SQLite Android

时间:2015-11-06 11:36:38

标签: android sqlite

我正在尝试移动并显示下一个查询结果,我看到的示例引用了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)

不确定还有什么可以尝试,请帮忙。

1 个答案:

答案 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()之后

,而不是在所有情况下都重复它 无论如何它必须被执行。