6

嗨这是我的第二个问题。我有下表

|-----|-------|------|------|
|._id.|..INFO.|.DONE.|.LAST.|
|..1..|...A...|...N..|......|
|..2..|...B...|...Y..|..L...|<--- cursor.moveToPosition((int)_id-1);
|..3..|...C...|...Y..|......|
|..4..|...D...|...Y..|......|
|..5..|...E...|...N..|......|
|..6..|...F...|...N..|......|
|-----|-------|------|------|

我使用代码:

cursor = db.query(TABLE_NAME, new String[]{INFO,DONE,LAST},null,null,null,null,null);
cursor.moveToPosition((int)_id-1);
String Yval = cursor.getString(cursor.getColumnIndex(DONE));
do
{
    cursor.moveToNext();
    Yval= cursor.getString(cursor.getColumnIndex(DONE));
}
while (Yval=="Y");
s = Yval;

我最初将光标指向我访问的最后一行,然后我循环遍历 DONE 列中的值,如果该列的行中有 Y,则不会停止。当循环中出现 N 时,循环应该停止。但它不起作用。Yval 从不等于“Y”。因此光标执行了一次“moveToNext”然后退出循环,因为它不会将 Yval 读取为“Y”。(我还将所有内容都更改为整数。1 表示 N,0 表示 Y,但它仍然不起作用)那么我在这里做错了什么?

4

2 回答 2

6

equals()所以如果你想比较,你必须使用方法Strings

while (Yval.equals("Y"));

你应该知道:

  • ==测试参考相等。
  • equals测试值相等。

所以你想测试Yval String是否有Y值所以你必须使用equals()方法。

你的方法不起作用,因为:

String data = "lorem";
data == "lorem" ==> FALSE
data.equals("lorem") == TRUE


还要确保你Cursor有有效的,所以你需要添加到条件cursor.moveToNext()所以

cursor.moveToNext() && (Yval.equals("Y")

你也需要治疗cursor.moveToPosition((int)_id-1),所以将其添加到条件中。

于 2012-07-05T16:32:14.717 回答
3

我建议更改一些内容:

if(cursor.moveToPosition((int) _id - 1)) {
    int doneIndex = cursor.getColumnIndex(DONE);
    String Yval;
    do {
        Yval = cursor.getString(doneIndex);
    } while(Yval.equals("Y") && cursor.moveToNext());
}
  • 您应该检查位置是否存在行,_id - 1因为 SQLite_id是唯一的 id,而不是光标中行的位置。
  • 您只需要获取DONE一次列的索引,只需将其存储在局部变量中即可。
  • 正如欺骗者所提到的,String 是用equals()类似的方法测试的。
  • 您需要考虑如果所有行都“完成”会发生什么,那么您必须在抛出越界异常之前停止尝试读取光标。
于 2012-07-05T16:44:03.397 回答