Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/221.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android如何在无法传递应用程序上下文时从广播接收器启动数据库操作_Android - Fatal编程技术网

Android如何在无法传递应用程序上下文时从广播接收器启动数据库操作

Android如何在无法传递应用程序上下文时从广播接收器启动数据库操作,android,Android,在我的应用程序中,当广播接收器执行它所执行的操作时,我也想启动一个数据库操作,但处理数据库操作的类需要一个DB singleton实例,我通常将其保存在应用程序对象中,无法通过服务上下文访问 发生的情况如下: 这是我的数据库处理程序: public class DatabaseManager extends SQLiteOpenHelper { // Its a good practice for DBTools to be a singleton. Do not instantiat

在我的应用程序中,当广播接收器执行它所执行的操作时,我也想启动一个数据库操作,但处理数据库操作的类需要一个DB singleton实例,我通常将其保存在应用程序对象中,无法通过服务上下文访问

发生的情况如下:

这是我的数据库处理程序:

public class DatabaseManager extends SQLiteOpenHelper {

    // Its a good practice for DBTools to be a singleton. Do not instantiate it with "new DBTools(context)" but with
    // DBTools.getInstance(context) instead
    private static DatabaseManager sInstance;
    public SQLiteDatabase database;

    public static DatabaseManager getInstance(Context context) {

        if (sInstance == null) {
            sInstance = new DatabaseManager(context);
        }
        return sInstance;
    }

    public DatabaseManager(Context context) {
        super(context, Preferences.LOCAL_SQLITE_DATABASE_NAME, null, 1);
    }
在我的应用程序类中,我采用以下方式进行设置:

// SQLite Database Handler
public DatabaseManager databaseManager;

@Override
public void onCreate() {
    super.onCreate();

    databaseManager = DatabaseManager.getInstance(this);
在我的接收器中,我要启动数据库操作:

public class PushNotificationReceiver extends BroadcastReceiver{

@Override
public void onReceive(Context context, Intent intent) {
    //DatabaseManager databaseManager = DatabaseManager.getInstance(context); -> This didnt work when the database was closed in onDestroy of my app.
    new IncrementProgressIntoDB(context, eventId).execute();
这是递增的ProgressInDB

public class IncrementProgressIntoDB extends AsyncTask<Void, Void, Boolean> {

private int eventId;
private Context context;

public IncrementProgressIntoDB(Context context, int eventId) {
    this.context = context;
    this.eventId= eventId;
}

@Override
protected Boolean doInBackground(Void... params) {

    ((MyApplication) context).databaseManager.database.beginTransaction();
我在这里尝试了解决方案:

但是我获取的上下文无法将databaseManager解析为字段。

在您的
广播接收器的
onReceive()方法中,替换:

new IncrementProgressIntoDB(context, eventId).execute();
与:


试试这个。它应该可以工作。

启动一个服务来执行sqlite操作直到现在我只能让推送通知与接收器一起工作。我想处理这个问题,然后开始处理一个服务,以便在电话重启后通知可以工作。尝试了这个方法,它通过了应用程序上下文,但现在我得到了一个数据库的NullPointerException,因为它在应用程序classI的onDestroy中被杀死。我将尝试在那里重新安装它
new IncrementProgressIntoDB(context, eventId).execute();
new IncrementProgressIntoDB((MyApplication)context.getApplicationContext(), eventId).execute();