陷入无限循环

时间:2012-03-20 21:26:28

标签: java android sqlite infinite-loop

我正在尝试检查数据库中的某些信息。如果我运行以下代码而不在循环中它运行正常,但只检查第一行,我需要它做的是检查每行的名称和日期。

如果我正确理解了while循环,它会将我的光标移动到下一行,然后再次运行代码。任何人都可以看到为什么这会循环直到我的程序崩溃?

while (cursor.moveToNext()) {
String titlefromdb = cursor.getString(3);



if (strTitle.equals(titlefromdb)&& cursor.getString(1).equals(dateselforap)) {


Log.d("insidematch", "date and title matched");

final Dialog matchdiag = new DialogCW2Organisor.this);

matchdiag.setContentView(R.layout.apptmatch);
matchdiag.setTitle("View/Edit Appointment");
matchdiag.setCancelable(true);

TextView matchtxt = (TextView) matchdiag.findViewById(R.id.matchtxt);

matchtxt.setText("Appointment \""+ titlefromdb + "\" already exists, please choose a different event title");

Button btnmatchok = (Button) matchdiag.findViewById(R.id.btnmatch);
btnmatchok.setOnClickListener(new OnClickListener() {

//on click for cancel button
@Override
public void onClick(View v) {
matchdiag.dismiss();}
        });
matchdiag.show();
} else {
addAppt(strTime, strTitle, strDet);
cursor = getAppts();
dialog.dismiss();
}
}

2 个答案:

答案 0 :(得分:2)

在调用moveToNext()之前尝试移动到第一条记录。 将您的功能移动到do / while循环中,这样您仍然可以获取第一条记录

if (!cursor.moveToFirst())
    return; //nothing to do since the cursor is empty

do
{
    String titlefromdb = cursor.getString(3);

    if (strTitle.equals(titlefromdb)&& cursor.getString(1).equals(dateselforap)) {
        Log.d("insidematch", "date and title matched");

        final Dialog matchdiag = new DialogCW2Organisor.this);

        matchdiag.setContentView(R.layout.apptmatch);
        matchdiag.setTitle("View/Edit Appointment");
        matchdiag.setCancelable(true);

        TextView matchtxt = (TextView) matchdiag.findViewById(R.id.matchtxt);

        matchtxt.setText("Appointment \""+ titlefromdb + "\" already exists, please choose a different event title");

        Button btnmatchok = (Button) matchdiag.findViewById(R.id.btnmatch);
        btnmatchok.setOnClickListener(new OnClickListener() {

        //on click for cancel button
        @Override
        public void onClick(View v) {
            matchdiag.dismiss();
            }
        });

        matchdiag.show();

    } else {
        addAppt(strTime, strTitle, strDet);
        cursor = getAppts();
        dialog.dismiss();
    }
} while (cursor.moveToNext());

答案 1 :(得分:0)

我也遇到了无限循环问题,这也让我感到困惑,因为一段时间!moveToNext()循环应肯定完成。

但是,解决方法是在游标长度上使用for循环,并处理每个cursor.moveToPosition(i)。

for (int i = 0; i <= cursorLen; i++) {
  if (!cursor.moveToPosition(i)) {
    return;
  }
  // process your cursor
}

我觉得这必须是Cursor实现的一个错误,因为在cursor.moveToNext()上的while循环应该总是完成。