0

だから私はSQLデータベースからいくつかの座標を取得し、それらをarraylistに格納する関数を持っています. カーソルから読み取った値を出力していますが、良好です。ただし、ループの直後に配列リストに保存した値を出力すると、すべての値が配列リストに最後に追加した値に設定されているように見えます。私はここで何か間違っていますか?

コード:

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
4

4 に答える 4

10

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());
于 2012-06-27T02:10:14.313 に答える
4

次のように、同じオブジェクトを変更するのではなく、反復ごとに新しいオブジェクトを作成する必要があります。

do {
     myCoord = new Coord();

ループの反復ごとに宣言せず、再インスタンス化するだけです

于 2012-06-27T02:10:41.273 に答える
0

これは、同じオブジェクトを配列に何度も追加し、そのたびにその値を上書きするためです。毎回新しいオブジェクトを作成してみてください。可能であれば、不変のオブジェクトを作成してください。

于 2012-06-27T02:13:13.417 に答える