Java循环故障排除
我正在寻找做以下事情的最佳方法 我有一个这样的循环Java循环故障排除,java,android,sqlite,loops,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);
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);
我该怎么做?答案可能很明显,但我自己也很困惑。类似这样的事情
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());
}
像这样的
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());
}
只是对问题中代码的一些更正
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);
只是对问题中代码的一些更正
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);
重新组织@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,所以我删除了它们。重新组织@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,所以我删除了它们。java使用对值的引用,这就是问题所在。
正如@st0le所指出的,您可以直接在循环中复制粘贴代码 为什么我们可以这样做?因为调用
GeoPoint point=new GeoPoint(tlat,tlng)
将更改存储在point
中的引用,而不是其值。点
的原始值仍然存在,并且对它的引用已过覆盖项
构造函数
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
中可见,java使用对值的引用,这就是问题所在。正如@st0le所指出的,您可以直接在循环中复制粘贴代码 为什么我们可以这样做?因为调用
GeoPoint point=new GeoPoint(tlat,tlng)
将更改存储在point
中的引用,而不是其值。点
的原始值仍然存在,并且对它的引用已过覆盖项
构造函数
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
中可以立即看到更改,但是不断声明相同的变量(例如点
和覆盖项
不会导致之前的变量被覆盖吗,这些变量只是该循环迭代作用域的局部变量。@Meowmix-不,它们不会。new
操作每次创建一个新对象。(@Mauro-scoping不相关。如果点
和覆盖项
在循环之外声明,则情况相同。)@Meowmix:不相关。因为在每次迭代中,您都在创建新对象。只是引用名称与旧名称相同,但对象本身与旧名称不同。但是不断声明相同的变量(例如point
和overlayitem
是否会导致之前的变量被覆盖?不应该执行Meowmix,这些变量仅在该循环迭代范围内。@Meowmix-不,它们不会。new
操作每次创建一个新对象。(@Mauro-scoping不相关。如果点
和覆盖项
在循环之外声明,则情况相同。)@Meowmix:不相关。因为在每次迭代中,您都在创建新对象。只是引用名称和旧名称相同,但对象本身不同于旧名称。mcursor可能必须按该顺序调用这些方法,所以不能重新排列。好意,可惜。卡尔的回答指出的是,这些字段不需要声明。因此,请尝试调用String tname=mcursor.getString(1)
以获取已使用的值,并调用mcursor.getString(6)
(不带赋值)以获取未使用的值。很抱歉,@neXus,但这不可能是正确的-光标位于特定的记录位置,并且可以按任何顺序获取记录的字段。在调用moveToNext()
之前,光标或其对数据的访问没有任何更改。我一定是把它与其他东西混淆了。可能是从带有InputStream的文件中读取。我从没用过游标,但我想我记得。谢谢mcursor可能必须按照这个顺序调用这些方法,所以重新排列不是一个选项。好意,可惜。卡尔的回答指出的是,这些字段不需要声明。因此,请尝试调用String tname=mcursor.getString(1)
以获取已使用的值,并调用mcursor.getString(6)
(不带赋值)以获取未使用的值。很抱歉,@neXus,但这不可能是正确的-光标位于特定的记录位置,并且可以按任何顺序获取记录的字段。在调用moveToNext()
之前,光标或其对数据的访问没有任何更改。我一定是把它与其他东西混淆了。可能是从带有InputStream的文件中读取。我从没用过游标,但我想我记得。谢谢