我的值为
问题Q-id
Q1 1
Q2 2
......等等
我想通过调用函数来检索它们。所以我使用了HashMaps的arraylist如下..
public ArrayList<HashMap<String,String>> getAllQuestions(Integer id)
{
try
{
HashMap<String,String> QuesList = new HashMap<String,String>();
ArrayList<HashMap<String, String>> QuestionArrayList = new ArrayList<HashMap<String, String>>();
// Select All Query
String selectQuery = <some query here>;
cursor = mDb.rawQuery(selectQuery, null);
// looping through all rows and adding to list
if (cursor.moveToFirst())
{
do
{
QuesList.put("ques_id", cursor.getString(2));
QuesList.put("ques_text", cursor.getString(8));
QuestionArrayList.add(QuesList);
Log.i("ques",cursor.getString(8) );
} while (cursor.moveToNext());
}
Log.i("check"," Ques list returned");
return QuestionArrayList;
}
catch (SQLException mSQLException)
{
Log.e(TAG, "getTestData >>"+ mSQLException.toString());
throw mSQLException;
}
}
现在,Logcat显示在单个提取时成功检索到所有问题(如Log.i语句所示),但是当我在结束时运行以下循环时,所有元素都被最后提取的问题替换。非常感谢任何帮助。
for(HashMap<String, String> t : QuesList )
{
Log.d("out there", "count" + t.getString());
Log.i("mapping....",t.get("ques_id"));
}
答案 0 :(得分:5)
调用add
方法时,仅添加对象的引用。因此,下次修改对象时,引用会引用修改后的对象,并且不会保留对象的旧状态。
在您的情况下,每次要将其添加到List
时,您都必须创建新对象:
// looping through all rows and adding to list
if (cursor.moveToFirst())
{
do
{
//Create a new object instance of the Map
HashMap<String,String> QuesList = new HashMap<String,String>();
QuesList.put("ques_id", cursor.getString(2));
QuesList.put("ques_text", cursor.getString(8));
QuestionArrayList.add(QuesList);
Log.i("ques",cursor.getString(8) );
} while (cursor.moveToNext());
}
答案 1 :(得分:0)
原因是,在你的循环中,你只使用了在QuestionArrayList中添加的单个Questlist实例。
尝试移动
HashMap<String,String> QuesList = new HashMap<String,String>();
在循环中。
do
{
HashMap<String,String> QuesList = new HashMap<String,String>();
QuesList.put("ques_id", cursor.getString(2));
QuesList.put("ques_text", cursor.getString(8));
QuestionArrayList.add(QuesList);
Log.i("ques",cursor.getString(8) );
} while (cursor.moveToNext());
答案 2 :(得分:0)
此处不需要列表,使用地图存储所有键/值对:
QuesList.put(cursor.getString(2), cursor.getString(8));
将您的问题存储在地图中。然后你可以循环:
for(String q : QuesList.values()) {…}
Ps:你的问题是你只使用一张地图并继续使用相同的密钥,覆盖以前的条目。