Не удалось записать в базу данных - PullRequest
0 голосов
/ 27 марта 2011

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 голосов
/ 27 марта 2011

В общем случае if защита для массивов должна быть i < size, а не i < size - 1.

Чтобы вообще избежать ошибок в охране, вы можете использовать:

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

вместо.

Редактировать - Кроме того, доступ к вашей базе данных, кажется, осуществляется только в onCreate. Это необходимо сделать в вашем LocationListener, если вы ожидаете, что он будет вызван при получении обновлений.

onCreate вызывается только один раз при создании вашей деятельности. Вы должны открыть свою базу данных здесь, а затем осуществлять доступ, когда вы действительно получите данные.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...