如何为光标迭代器中的arraylist项指定值

时间:2017-12-12 07:37:49

标签: android sqlite arraylist cursor

我正在尝试将一个变量分配给游标中的ArrayList项,但它总是返回最后一个值。这是下面的代码。

从数据库获取价值

 public ArrayList<Bean> getPendingData(String s) {
    SQLiteDatabase db = getWritableDatabase();
    String[] columns = {name};
    String[] selectionArgs = {s};
    Cursor cursor = db.query(TABLE_NAME, columns, " pending= ? ", selectionArgs, null, null, null, null);
    cursor.moveToFirst();       
    ArrayList<Bean> pending = new ArrayList<>();
    String index0 = null;
    Bean bean;
    bean = new Bean();
    while(!cursor.isAfterLast()) {
        index0 = cursor.getString(cursor.getColumnIndex(name));
        bean.setQuestion(index0);
        pending.add(bean);
        cursor.moveToNext();
    }

    cursor.close();
    return pending;
}

Bean.java

public class Bean {
public static int id; // ans
public static String score;
public static String logo;
public static String image;

public static String getQuestion() {
    return question;
}

public static void setQuestion(String question) {
    Bean.question = question;
}

public static String question;
public static String description;
public static String option_three;
public static String OptionFour;

}

2 个答案:

答案 0 :(得分:0)

你应该在while块中初始化你的bean:

while(!cursor.isAfterLast()) {
    Bean bean = new Bean();
    index0 = cursor.getString(cursor.getColumnIndex(name));
    bean.setQuestion(index0);
    pending.add(bean);
    cursor.moveToNext();
}

原因是Java通过引用使用对象,因此您始终将相同的对象添加到数组&#34; pending&#34;,但是在后续迭代中您需要更改此值对象,所以最后你得到最后一次迭代的值。

答案 1 :(得分:0)

当光标位于最后一行位置时,

cursor.isAfterLast()返回true。添加!(不)意味着执行直到它不在光标的末尾。

所以while(!cursor.isAfterLast()){}表示while循环将遍历到光标的最后一条记录。

使用此方法获取从游标返回的所有行。

if (cursor != null) {
        if (cursor.getCount() > 0) {
            if (cursor.moveToFirst()) {
                homeClassesArrayList = new ArrayList<>();
                do {
                   // fetching data
                } while (cursor.moveToNext());
            }
        }
}