2012-06-27 2 views
0

Итак, у меня есть функция, которая получает некоторые координаты из базы данных sql и сохраняет их в arraylist. Я печатаю значения, когда читаю их с помощью курсора, и они хороши. Однако, когда я сразу же после цикла и распечатываю значения, хранящиеся в списке массивов, все значения, как представляется, устанавливаются в последнее значение, которое я добавил в arraylist. Я здесь что-то не так?ArrayList.add() не работает правильно

код:

public ArrayList<Coord> getCoordMarkers(int myUserId) 
{ 
    Log.d("getCoordMarkers()", "Called"); 
Coord myCoord = new Coord(); 
ArrayList<Coord> markerArray = new ArrayList<Coord>(); 
String sql = "SELECT "+ userId + " , " + timestamp + " , " + coordX + " , " + 
       coordY + " , " + coordType + " , " + coordId + " , " + coordTypeTable+ "." + 
       coordTypeDesc + " FROM " + coordTable + " JOIN " + coordTypeTable + " ON " + 
       coordTable + "." + coordType + " = " + coordTypeTable + "." + coordTypeAbbr + 
       " WHERE " + userId + " = '" + myUserId + "' AND " + coordTypeTable + "." + 
       coordTypeDesc + " != 'User Location';"; 
    // AND it is a marker 
    SQLiteDatabase db = this.getWritableDatabase(); 
    Cursor cur = db.rawQuery(sql, null); 
    if(cur.moveToFirst()) { 
     do { 
      myCoord.userId = cur.getInt(0); 
      myCoord.timestamp = cur.getLong(1); 
      myCoord.x = cur.getDouble(2); 
      myCoord.y = cur.getDouble(3); 
      myCoord.coordType = cur.getInt(4); 
      myCoord.id = cur.getInt(5); 
      myCoord.coordTypeDesc = cur.getString(6); 
      markerArray.add(myCoord); 
      Log.d("getCoordMarkers()", "X: " + myCoord.x + " Y: " + myCoord.y); 
     } while(cur.moveToNext()); 
    } 
    cur.close(); 
    db.close(); 
    for(int i = 0; i < markerArray.size(); i++) 
    { 
     Coord myCoord2 = markerArray.get(i); 
     Log.d("Test Marker", "I: "+ i + " X: " + myCoord2.x + " Y: "+ myCoord2.y); 

    } 
    return markerArray; 
} 

Ниже приводится распечатка протокола из кода выше

06-27 01:46:06.588: DEBUG/getCoordMarkers()(541): Called 
06-27 01:46:06.638: DEBUG/getCoordMarkers()(541): X: -122.093451 Y: 37.420599 
06-27 01:46:06.638: DEBUG/getCoordMarkers()(541): X: -122.093451 Y: 37.420599 
06-27 01:46:06.648: DEBUG/getCoordMarkers()(541): X: -122.094695 Y: 37.419679 
06-27 01:46:06.648: DEBUG/getCoordMarkers()(541): X: -122.094695 Y: 37.419679 
06-27 01:46:06.648: DEBUG/getCoordMarkers()(541): X: -122.090104 Y: 37.423633 
06-27 01:46:06.658: DEBUG/getCoordMarkers()(541): X: -122.090104 Y: 37.423633 
06-27 01:46:06.658: DEBUG/getCoordMarkers()(541): X: -122.092078 Y: 37.420464 
06-27 01:46:06.658: DEBUG/getCoordMarkers()(541): X: -122.092078 Y: 37.420464 
06-27 01:46:06.658: DEBUG/getCoordMarkers()(541): X: -122.091992 Y: 37.420668 
06-27 01:46:06.668: DEBUG/getCoordMarkers()(541): X: -122.091992 Y: 37.420668 
06-27 01:46:06.668: DEBUG/getCoordMarkers()(541): X: -122.09594 Y: 37.42077 
06-27 01:46:06.678: DEBUG/getCoordMarkers()(541): X: -122.09594 Y: 37.42077 
06-27 01:46:06.678: DEBUG/getCoordMarkers()(541): X: -122.09255 Y: 37.42118 
06-27 01:46:06.678: DEBUG/getCoordMarkers()(541): X: -122.09255 Y: 37.42118 
06-27 01:46:06.688: DEBUG/getCoordMarkers()(541): X: -122.095897 Y: 37.423633 
06-27 01:46:06.698: DEBUG/getCoordMarkers()(541): X: -122.095897 Y: 37.423633 
06-27 01:46:06.708: DEBUG/Test Marker(541): I: 0 X: -122.095897 Y: 37.423633 
06-27 01:46:06.708: DEBUG/Test Marker(541): I: 1 X: -122.095897 Y: 37.423633 
06-27 01:46:06.708: DEBUG/Test Marker(541): I: 2 X: -122.095897 Y: 37.423633 
06-27 01:46:06.708: DEBUG/Test Marker(541): I: 3 X: -122.095897 Y: 37.423633 
06-27 01:46:06.718: DEBUG/Test Marker(541): I: 4 X: -122.095897 Y: 37.423633 
06-27 01:46:06.718: DEBUG/Test Marker(541): I: 5 X: -122.095897 Y: 37.423633 
06-27 01:46:06.728: DEBUG/Test Marker(541): I: 6 X: -122.095897 Y: 37.423633 
06-27 01:46:06.739: DEBUG/Test Marker(541): I: 7 X: -122.095897 Y: 37.423633 
06-27 01:46:06.739: DEBUG/Test Marker(541): I: 8 X: -122.095897 Y: 37.423633 
06-27 01:46:06.739: DEBUG/Test Marker(541): I: 9 X: -122.095897 Y: 37.423633 
06-27 01:46:06.748: DEBUG/Test Marker(541): I: 10 X: -122.095897 Y: 37.423633 
06-27 01:46:06.748: DEBUG/Test Marker(541): I: 11 X: -122.095897 Y: 37.423633 
06-27 01:46:06.748: DEBUG/Test Marker(541): I: 12 X: -122.095897 Y: 37.423633 
06-27 01:46:06.748: DEBUG/Test Marker(541): I: 13 X: -122.095897 Y: 37.423633 
06-27 01:46:06.758: DEBUG/Test Marker(541): I: 14 X: -122.095897 Y: 37.423633 
06-27 01:46:06.758: DEBUG/Test Marker(541): I: 15 X: -122.095897 Y: 37.423633 

ответ

10

Попробуйте reinstantiating myCord. Это похоже на простую проблему переназначения. Оплачивает, чтобы узнать о указателях, даже с Java!

do { 
     myCoord = new Coord(); //********** 
     myCoord.userId = cur.getInt(0); 
     myCoord.timestamp = cur.getLong(1); 
     myCoord.x = cur.getDouble(2); 
     myCoord.y = cur.getDouble(3); 
     myCoord.coordType = cur.getInt(4); 
     myCoord.id = cur.getInt(5); 
     myCoord.coordTypeDesc = cur.getString(6); 
     markerArray.add(myCoord); 
     Log.d("getCoordMarkers()", "X: " + myCoord.x + " Y: " + myCoord.y); 
     myCoord = null; //for the garbage collector ******* 
    } while(cur.moveToNext()); 
+1

Спасибо, что сделал трюк, я не понял, что список массивов использует указатели для назначения коордов. У вас есть рекомендуемые источники для указателей в java? Спасибо – jgelderloos

+1

Ну, это больше о том, как научиться работать указатели и как Java скрывает их от вас. Java полностью передается по значению. Вот веб-сайт о указателях в C: http://www.cprogramming.com/tutorial/lesson6.html –

+0

Ну, у меня есть опыт работы с указателями на C, я просто не понял, что Java это делает, потому что он не делает очевидным, что это делает это. – jgelderloos

4

нужно построить новый объект для каждой итерации, вместо изменения того же самого, следующим образом:

do { 
    myCoord = new Coord(); 

Не объявляйте его каждый цикл итерации, только reinstantiate

+0

Убедитесь, что вы не обновляете переменную –

+0

@ jack57: Согласен. Просто мне легче читать и понимать код, когда он действительно огромен. –

0

Это потому, что вы добавляете один и тот же объект в массив снова и снова, каждый раз переписывая его значение! Попробуйте создать новый объект каждый раз, immutable object, если сможете.

Смежные вопросы