У меня есть приложение, в котором у меня есть класс обслуживания, который реализует функцию 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)
Вы показываете все, кроме ошибки. Покажите нам свой dbadapter, особенно метод openToWrite. – Barak
Эй, Барак, извините. Я просто добавил весь класс dbAdapter, а также конкретный метод openToWrite(). Есть ли у вас какие-либо идеи относительно проблемы? Благодаря! –