Java循环故障排除

时间:2010-08-25 13:42:25

标签: java android sqlite loops

我正在寻找以下的最佳方式..

我有一个像这样的循环...

        while(mcursor.moveToNext()){
        String tname = mcursor.getString(4);
        String tmessage = mcursor.getString(7);
        String tlink = mcursor.getString(5);
        String tsname = mcursor.getString(3);
        Double tlat = mcursor.getDouble(1);
        Double tlng = mcursor.getDouble(2);
    }

对于循环的每个元素我想应用以下内容......

     GeoPoint point = new GeoPoint(tlat,tlng);
   OverlayItem overlayitem = new OverlayItem(point, tname, tmessage);
    itemizedoverlay.addOverlay(overlayitem);
    mapOverlays.add(itemizedoverlay);

我该怎么做?答案很明显,但我自己也很困惑。

4 个答案:

答案 0 :(得分:2)

像这样......

mcursor = getCursor(); //or whatever
if(mcursor != null && mcursor.moveToFirst())
{
        do
        {
        String tname = mcursor.getString(1);
        String tmessage = mcursor.getString(2);
        String tlink = mcursor.getString(3);
        String tsname = mcursor.getString(6);
        Double tlat = mcursor.getDouble(2);
        Double tlng = mcursor.getDouble(3);

        GeoPoint point = new GeoPoint(tlat,tlng);
        OverlayItem overlayitem = new OverlayItem(point, tname, tmessage);
        itemizedoverlay.addOverlay(overlayitem);
        mapOverlays.add(itemizedoverlay);


        }while(mcursor.moveToNext());

}

答案 1 :(得分:2)

java使用对值的引用,这就是你的问题所在 正如@ st0le所指出的,你可以直接在循环中复制粘贴你的代码。

为什么我们这样做?因为调用GeoPoint point = new GeoPoint(tlat,tlng)会更改point中存储的引用而不是其值。 point的原始值仍然存在,并且对它的引用已经过去了OverlayItem构造函数。

while(mcursor.moveToNext()){
    String tname = mcursor.getString(4);
    String tmessage = mcursor.getString(7);
    String tlink = mcursor.getString(5);
    String tsname = mcursor.getString(3);
    Double tlat = mcursor.getDouble(1);
    Double tlng = mcursor.getDouble(2);

    GeoPoint point = new GeoPoint(tlat,tlng);
    OverlayItem overlayitem = new OverlayItem(point, tname, tmessage);
    itemizedoverlay.addOverlay(overlayitem);
}
mapOverlays.add(itemizedoverlay);

并且你会想要在循环之外的最后一行,否则itemizedoverlay将多次在mapOverlays。只添加一次就足够了。在进入循环之前或之后。将项目添加到itemizedoverlay会更改其。之前对itemizedoverlay的引用仍然相同,因此更改将立即显示在mapOverlays中。

答案 2 :(得分:1)

对问题中的代码进行一些更正......

Double tlat = mcursor.getDouble(2); // should this be 4?
Double tlng = mcursor.getDouble(3); // should this be 5?

// You probably don't want to do this for every loop iteration ...
mapOverlays.add(itemizedoverlay);

答案 3 :(得分:1)

重组@ st0le的答案,将一起使用的数据分组在一起:

mcursor = getCursor(); //or whatever
if (mcursor != null && mcursor.moveToFirst()) {
    do {
        Double tlat = mcursor.getDouble(5);
        Double tlng = mcursor.getDouble(6);
        GeoPoint point = new GeoPoint(tlat,tlng);

        String tname = mcursor.getString(1);
        String tmessage = mcursor.getString(2);
        OverlayItem overlayitem = new OverlayItem(point, tname, tmessage);
        itemizedoverlay.addOverlay(overlayitem);
        mapOverlays.add(itemizedoverlay);
        } while(mcursor.moveToNext());
    }

这表明我们甚至没有使用tlink& tsname,所以我删除了它们。