2015-07-15 4 views
0

Editted: LocationService класс:Как добавить значения в базу данных?

public class LocationService extends Service { 
    private Location mLocation; 
    private LocationDatabaseHelper mLocationDatabaseHelper; 
    private LocationModel mLocationModel; 
    public static final long NOTIFY_INTERVAL = 30 * 1000; 

    private Handler mHandler = new Handler(); 

    private Timer mTimer = null; 

    @Override 
    public IBinder onBind(Intent intent) { 
     return null; 
    } 

    @Override 
    public void onCreate() { 
     // cancel if already existed 
     if(mTimer != null) { 
      mTimer.cancel(); 
     } else { 
      // recreate new 
      mTimer = new Timer(); 
     } 
     // schedule task 
     mTimer.scheduleAtFixedRate(new TimeDisplayTimerTask(), 0, NOTIFY_INTERVAL); 

     mLocationDatabaseHelper = new LocationDatabaseHelper(this); 


    } 

    @Override 
    public void onDestroy() { 
     mTimer.cancel(); 
    } 

    private class TimeDisplayTimerTask extends TimerTask implements LocationListener { 

     @Override 
     public void run() { 

      mHandler.post(new Runnable() { 

       @Override 
       public void run() { 

        //Get GPS location 
        LocationManager locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE); 
        Criteria criteria = new Criteria(); 
        String provider = locationManager.getBestProvider(criteria, true); 
        mLocation = locationManager.getLastKnownLocation(provider); 
        locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, TimeDisplayTimerTask.this); 
        mLocationModel = LocationModel.getInstance(); 

        mLocationModel.setLng((float)mLocation.getLatitude()); 
        mLocationModel.setLng((float)mLocation.getLongitude()); 

        mLocationDatabaseHelper.insertGPSLogToDatabase(mLocationModel); 
       } 


      }); 
     } 

LocationModel класс:

public class LocationModel { 
    private float mLat; 
    private float mLng; 
    private String mAddress; 
    private int mStatus; 
    private static LocationModel mLocation = null; 


    private LocationModel(){ 

    } 

    public static LocationModel getInstance() { 
      if(mLocation == null) { 
       mLocation = new LocationModel(); 
      } 
      return mLocation; 
     } 

    public LocationModel(int mStatus,float mLat, 
      float mLng,String mAddress){ 

     this.mLat = mLat; 
     this.mLng = mLng; 
     this.mStatus = mStatus; 
    } 
    public float getLat() { 
     return mLat; 
    } 
    public float getLng() { 
     return mLng; 
    } 
    public int getStatus() { 
     return mStatus; 
    } 
    public void setLat(float lat) { 
     this.mLat = lat; 
    } 
    public void setLng(float lng) { 
     this.mLng = lng; 
    } 
    public void setStatus(int status) { 
     this.mStatus = status; 
    } 

} 

Метод для вставки значений в базу данных:

public boolean insertGPSLogToDatabase(LocationModel modelGPS){ 
     ContentValues values = new ContentValues(); 
     values.put("status", modelGPS.getStatus()); 
     values.put("lat", modelGPS.getLat()); 
     values.put("lng",modelGPS.getLng());  
     myDataBase.insert("locations", null, values); 
     return true;   
    } 

Интересно, что объект LocationModel я могу положить, что метод? Если я поставлю это:

mLocationModel = new LocationModel(null,mLocation.getLatitude(), 
          mLocation.getLongitude()); 

Он покажет ошибку, поскольку статус является int stype и не может быть пустым. Если бы это:

mLocationModel = new LocationModel(); 
mLocationModel.setLat(mLocation.getLatitude()); 
mLocationModel.setLng(mLocation.getLongitude()); 

Я не знаю, правильно ли это или неправильно, потому что я получаю NullPointer в строке «mLocationModel = новый LocationModel();» Я новичок программист, поэтому, пожалуйста, научите меня хорошо. Спасибо!

Editted: Error Log:

07-15 02:35:41.359: E/AndroidRuntime(1554): FATAL EXCEPTION: main 
07-15 02:35:41.359: E/AndroidRuntime(1554): java.lang.NullPointerException 
07-15 02:35:41.359: E/AndroidRuntime(1554):  at com.example.testservice.LocationService$TimeDisplayTimerTask$1.run(LocationService.java:77) 
07-15 02:35:41.359: E/AndroidRuntime(1554):  at android.os.Handler.handleCallback(Handler.java:615) 
07-15 02:35:41.359: E/AndroidRuntime(1554):  at android.os.Handler.dispatchMessage(Handler.java:92) 
07-15 02:35:41.359: E/AndroidRuntime(1554):  at android.os.Looper.loop(Looper.java:137) 
07-15 02:35:41.359: E/AndroidRuntime(1554):  at android.app.ActivityThread.main(ActivityThread.java:4745) 
07-15 02:35:41.359: E/AndroidRuntime(1554):  at java.lang.reflect.Method.invokeNative(Native Method) 
07-15 02:35:41.359: E/AndroidRuntime(1554):  at java.lang.reflect.Method.invoke(Method.java:511) 
07-15 02:35:41.359: E/AndroidRuntime(1554):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786) 
07-15 02:35:41.359: E/AndroidRuntime(1554):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 
07-15 02:35:41.359: E/AndroidRuntime(1554):  at dalvik.system.NativeStart.main(Native Method) 
+0

Я определил его в OnCreate класса обслуживания –

+0

@Daniel Нугента: Я Editted с полным классом, пожалуйста, посмотрите –

+0

Да, у меня есть. Я добавляю журнал ошибок, пожалуйста, посмотрите, строка 77 - «mLocationModel.setLng ((float) mLocation.getLatitude()); не "mLocationModel = new LocationModel();", моя ошибка: D –

ответ

0

Проблема заключается в том, что ваше местоположение нуль. Каждый раз, когда вы используете метод getLastKnownLocation(), вы должны выполнить нулевую проверку результата, так как он часто возвращает нулевое местоположение.

Вы также можете использовать обратный вызов onLocationChanged(), так как он никогда не дает нулевого местоположения.

private class TimeDisplayTimerTask extends TimerTask implements LocationListener { 

     @Override 
     public void run() { 

      mHandler.post(new Runnable() { 

       @Override 
       public void run() { 

        //Get GPS location 
        LocationManager locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE); 
        Criteria criteria = new Criteria(); 
        String provider = locationManager.getBestProvider(criteria, true); 
        mLocation = locationManager.getLastKnownLocation(provider); 
        locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, TimeDisplayTimerTask.this); 
        mLocationModel = LocationModel.getInstance(); 

        //add a null check here: 
        if (mLocation != null) { 
         mLocationModel.setLng((float) mLocation.getLatitude()); 
         mLocationModel.setLng((float) mLocation.getLongitude()); 

         mLocationDatabaseHelper.insertGPSLogToDatabase(mLocationModel); 
        } 
       } 


      }); 
     } 

     @Override 
     public void onLocationChanged(Location location) { 

      //location will never be null here 
      mLocation = location; 
      mLocationModel = LocationModel.getInstance(); 

      mLocationModel.setLng((float) mLocation.getLatitude()); 
      mLocationModel.setLng((float) mLocation.getLongitude()); 

      mLocationDatabaseHelper.insertGPSLogToDatabase(mLocationModel); 
     } 
    } 
Смежные вопросы