无法成功写入数据库

时间:2011-03-27 15:40:55

标签: android sqlite gps

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中读取。 有人可以用一些想法帮助我。谢谢你

1 个答案:

答案 0 :(得分:0)

一般来说if数组的保护应该是i < size而不是i < size - 1

为了避免警卫中的错误,你可以使用:

for (GeoPoint loc : geoPointsArray) {
    ....

代替。

编辑 - 此外,您的数据库访问权限似乎仅在onCreate中执行。如果您希望在获得更新时调用它,则需要在LocationListener中执行此操作。

onCreate仅在您的活动创建时调用一次。您应该在此处打开数据库,然后在实际获取数据时进行访问。