2012-05-30 1 views
4

У меня есть приложение, в котором у меня есть класс обслуживания, который реализует функцию locationlistener. Я хочу иметь возможность передать местоположение, полученное в onLocationChanged(), обратно к моей основной деятельности. Я пытался реализовать это до сих пор, написав базу данных SQLite, но получал ошибки при попытке открыть базу данных для записи. Я считаю, что это связано с отсутствием контекста записи, но я не смог понять это. Однако запись в базу данных отлично работает, когда я делаю это в onCreate(). Сначала я просто попытался сделать это как:Ошибка ввода данных на Android в базу данных SQLite из класса LocationListener

@Override 
    public void onLocationChanged(Location loc) {//Spits out single location for current disconnect 
     System.out.println("location equals "+loc); 
     latitude=Double.toString(loc.getLatitude()); 
     longitude=Double.toString(loc.getLongitude()); 
     writeToDb(MyLocListener.this,latitude,longitude);  
     man.removeUpdates(listener);//Stops location manager from listening for updates 
     listener=null; 
     man=null; 
    } 

public void writeToDb(Context context,String latitude,String longitude){ 
    db=new DbAdapter(context); 
    db.openToWrite(); 
    db.deleteAll(); 
    db.insert(latitude); 
    db.insert(longitude); 
    db.close(); 
} 

Но это было бесполезно, и дал бы мне NullPointerException на db.openToWrite() линии каждый раз. getApplicationContext() тоже не работает. Метод

@Override 
public void onLocationChanged(Location loc) {//Spits out single location for current disconnect 
    System.out.println("location equals "+loc); 
    latitude=Double.toString(loc.getLatitude()); 
    longitude=Double.toString(loc.getLongitude()); 
    Runnable runner=new SaveLocation(latitude,longitude); 
    new Thread(runner).start(); 
    man.removeUpdates(listener);//Stops location manager from listening for updates 
    listener=null; 
    man=null; 
} 

public class SaveLocation implements Runnable{ 
     String latitude; 
     String longitude; 
    // DbAdapter db; 
     public SaveLocation(String latitude,String longitude){ 
      this.latitude=latitude; 
      this.longitude=longitude; 

     } 
     @Override 
     public void run() { 
      db.openToWrite(); 
      db.deleteAll(); 
      db.insert(latitude); 
      db.insert(longitude); 
      db.close();  
     } 
    } 

И я инициализируется базы данных в OnCreate(), как::

Я теперь модифицирована его писать в БД в потоке, как

public class MyLocListener extends Service implements LocationListener{ 
    static LocationManager man; 
    static LocationListener listener; 
    static Location location; 
    public DbAdapter db; 

    @Override 
    public void onCreate() { 
     super.onCreate(); 
     this.db=new DbAdapter(MyLocListener.this); 
    } 

Но теперь, эта вторая попытка по-прежнему дает мне гораздо более сжатую ошибку, но она все еще виновата в строке, где я пытаюсь открыть базу данных для записи. Строка MyLocListener.java:92 относится к строке db.openToWrite();

Ошибка:

05-30 15:35:19.698: W/dalvikvm(4557): threadid=9: thread exiting with uncaught exception (group=0x4001d7e0) 
05-30 15:35:19.706: E/AndroidRuntime(4557): FATAL EXCEPTION: Thread-10 
05-30 15:35:19.706: E/AndroidRuntime(4557): java.lang.NullPointerException 
05-30 15:35:19.706: E/AndroidRuntime(4557):  at com.phonehalo.proto.MyLocListener$SaveLocation.run(MyLocListener.java:92) 
05-30 15:35:19.706: E/AndroidRuntime(4557):  at java.lang.Thread.run(Thread.java:1096) 
+0

Вы показываете все, кроме ошибки. Покажите нам свой dbadapter, особенно метод openToWrite. – Barak

+0

Эй, Барак, извините. Я просто добавил весь класс dbAdapter, а также конкретный метод openToWrite(). Есть ли у вас какие-либо идеи относительно проблемы? Благодаря! –

ответ

3

решаемые --- В случае, если кто-либо другой, имеющий такую ​​же проблему, я понял, решение, и я не могу поверить, насколько это просто было. Из-за сборки мусора java, я терял связь с моей SqlDatabase. Решение было просто объявить его статичным. Затем я могу использовать методы ввода/записи Sql внутри моего метода onLocationChanged(). Надеюсь, поможет!

Смежные вопросы