HY! 我现在正在尝试创建一个接收GPS数据的应用程序并将其存储在Sqlite数据库中。我创建了数据库,并且我还有一个GeoPoints数组列表,我放在我的地理点中.GPS数据是在KML文件的帮助下模拟。 现在,我的问题是,即使我成功显示使用新位置更新的地图,同时我尝试从Sqlite数据库读取并在屏幕上显示地理位置,我什么也没得到 - 屏幕上没有显示文字。
这是我的代码:
public class screen4 extends MapActivity
{
private LocationManager lm;
private LocationListener locationListener;
private MyLocationOverlay myLocOverlay;
private MapView mapView;
private MapController mc;
List<GeoPoint> geoPointsArray = new ArrayList<GeoPoint>();
int latitude;
int longitude;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.screen4);
lm = (LocationManager)
getSystemService(Context.LOCATION_SERVICE);
locationListener = new MyLocationListener();
lm.requestLocationUpdates(LocationManager.GPS_PROVIDER,0,0,locationListener);
mapView = (MapView) findViewById(R.id.mapview1);
mapView.setBuiltInZoomControls(true);
mc = mapView.getController();
initMyLocation();
DBAdapter db=new DBAdapter(this);
db.createDatabase();
db.openDataBase();
for (int i = 0; i < geoPointsArray.size()-1; i++)
{
GeoPoint loc=geoPointsArray.get(i);
db.insertData(Integer.toString(loc.getLongitudeE6()),Integer.toString(loc.getLatitudeE6()),null,null,null);
}
Cursor c=db.getAllData();
if(c.moveToFirst())
{
do{
DisplayTitle(c);
}while(c.moveToNext());
}
if(c!=null&&!c.isClosed()){
db.close();
}
}
private void initMyLocation() {
myLocOverlay = new MyLocationOverlay(this, mapView);
myLocOverlay.enableMyLocation();
mapView.getOverlays().add(myLocOverlay);
}
public void DisplayTitle(Cursor c)
{
Toast.makeText(this,
"longitude: " + c.getString(0) + "\n" +
"latitude: " + c.getString(1) + "\n",
Toast.LENGTH_LONG).show();
}
private class MyLocationListener implements LocationListener
{
@Override
public void onLocationChanged(Location loc) {
if (loc != null) {
latitude=(int) (loc.getLatitude()* 1E6);
longitude=(int) (loc.getLongitude()* 1E6);
GeoPoint p = new GeoPoint(latitude,longitude);
geoPointsArray.add(p);
mc.animateTo(p);
mc.setZoom(17);
mapView.invalidate();
mapView.setSatellite(true);
}
}
@Override
public void onProviderDisabled(String provider) {
// TODO Auto-generated method stub
}
@Override
public void onProviderEnabled(String provider) {
}
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
}
}
protected boolean isRouteDisplayed() {
// TODO Auto-generated method stub
return false;
}
}
我逐行调试了我的代码,当我到达这一行(第一行)时:
for (int i = 0; i < geoPointsArray.size()-1; i++)
{
GeoPoint loc=geoPointsArray.get(i);
db.insertData(Integer.toString(loc.getLongitudeE6()),Integer.toString(loc.getLatitudeE6()),null,null,null);
}
调试器跳过这个片段......现在对我来说这意味着我的geoPointsArray中没有任何意义,我没有任何东西存储在数据库中,也没有什么可以从Sqlite中读取。 有人可以用一些想法帮助我。谢谢你
答案 0 :(得分:0)
一般来说if
数组的保护应该是i < size
而不是i < size - 1
。
为了避免警卫中的错误,你可以使用:
for (GeoPoint loc : geoPointsArray) {
....
代替。
编辑 - 此外,您的数据库访问权限似乎仅在onCreate
中执行。如果您希望在获得更新时调用它,则需要在LocationListener
中执行此操作。
onCreate
仅在您的活动创建时调用一次。您应该在此处打开数据库,然后在实际获取数据时进行访问。