我在应用程序商店中有一个应用程序,但有一种类型的错误报告,我似乎无法完全弄清楚.我的应用程序使用内部sqlite数据库,但在某些设备上(当然不是大多数)有时会发生以下错误:
android.database.sqlite.SQLiteException:没有这样的表:image_data(代码1):,同时编译:SELECT Min(标记)FROM image_data WHERE category ='Astronomy'AND stamp> = 1357426800 and coalesce(title_nl,'')=' "
我确信这个表存在,我确信这个查询是正确的.我知道这个错误只发生在应用程序的小部件和AlarmManager触发的BroadcastReceiver中(应用程序偶尔尝试下载新条目,因为它是当天应用程序的图片).
我认为它与访问数据库时我所处的Context有关.我有一个名为AppContextHelper的类,它扩展了Application并且有一个静态成员,我在其中存储上下文.访问数据库时始终使用该上下文.
我的问题:在某些情况下,当获取小部件中的数据库或前面提到的由AlarmManager触发的BroadcastReceiver时,这个上下文是无效的吗?在这种情况下,我应该使用提供的Context来支持'application'上下文?如果是这样,为什么该上下文无效或更好,哪个上下文是提供的?
提前致谢!
正如请求导致问题的代码一样,仅在某些设备上,而且仅在小部件或AlarmManager类中.我将发布导致AlarmManager类中的错误的代码(即具有最少行的代码)
初始化警报的代码:
Intent myIntent = new Intent(AppContextHelper.getContext(), ApodDownloader.class);
mPendingIntent = PendingIntent.getBroadcast(AppContextHelper.getContext(), 0, myIntent, 0);
AlarmManager alarmManager = (AlarmManager)AppContextHelper.getContext().getSystemService(Context.ALARM_SERVICE);
Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(System.currentTimeMillis());
alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis() + 10000, AlarmManager.INTERVAL_HOUR, mPendingIntent);
Run Code Online (Sandbox Code Playgroud)AppContextHelper.java
public class AppContextHelper extends Application {
private static Context mContext;
@Override
public void onCreate() {
super.onCreate();
mContext = this;
}
public static Context getContext(){
return mContext;
}
}
Run Code Online (Sandbox Code Playgroud)(部分)ApodDownloader.java(包含抛出异常的行)
@Override
public void onReceive(Context …Run Code Online (Sandbox Code Playgroud)