0

我有价值观

问题 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"));
     }
4

3 回答 3

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());
     }
于 2012-08-22T06:51:09.270 回答
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());
于 2012-08-22T06:54:19.373 回答
0

这里不需要列表,使用映射来存储所有键/值对:

QuesList.put(cursor.getString(2), cursor.getString(8));

将您的问题存储在地图中。然后你可以循环:

for(String q : QuesList.values()) {…}

Ps:您的问题是您只使用一个地图并继续使用相同的键,覆盖以前的条目。

于 2012-08-22T06:54:43.857 回答