6

こんにちはこれは私の2番目の質問です。私は次の表を持っています

|-----|-------|------|------|
|._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」と等しくなることはありません。したがって、カーソルは1つの「moveToNext」を実行してからループを終了します。これは、Yvalを「Y」として読み取らないためです。(私もすべてを整数に変更しました。Nは1、Yは0ですが、それでも機能しませんでした)では、ここで何が間違っているのでしょうか。

4

2 に答える 2

6

したがってequals()、比較したい場合はメソッドを使用する必要がありますStrings

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

知っている必要があります:

  • ==参照の同等性をテストします。
  • equals値の同等性をテストします。

したがって、Yval StringY値があるかどうかをテストする必要があるため、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 - 1SQLite_idは一意のIDであり、カーソル内の行の位置ではないため、行が位置に存在するかどうかを確認する必要があります。
  • 列のインデックスを取得する必要があるのはDONE1回だけで、ローカル変数に格納するだけです。
  • 詐欺師が述べたように、Stringはequals()同様の方法でテストされます。
  • すべての行が「DONE」の場合に何が起こるかを考慮する必要があります。その後、範囲外の例外がスローされる前に、カーソルの読み取りの試行を停止する必要があります。
于 2012-07-05T16:44:03.397 に答える