应用程序关闭时写入数据库

时间:2015-08-14 11:44:09

标签: java android sqliteopenhelper

我正在使用gcm进行聊天,我有onMessageReceived()方法接收消息,将其保存在数据库中,并向用户发送通知。

当应用程序运行(或暂停 - 在后台运行)时,这就是我将消息存储在数据库中的方式:

private DBHelper mDbHelper;
mDbHelper = new DBHelper(MainApplication.getAppContext());
SQLiteDatabase db = mDbHelper.getWritableDatabase();

方法getAppContext()是我的主要活动中的静态方法,它返回上下文。

这一切都有效。我收到一条消息,成功保存并收到通知(当应用正在运行时或在后台运行时)

问题是关闭应用程序的时间。我无法使用MainApplication.getAppContext();,因为应用关闭时没有上下文。

也许我应该以其他方式传递上下文?

<击>的更新

<击>

最后,如果应用程序关闭,我在服务器上保存了消息,当用户打开它时,我从服务器获取,从那里删除它们,并将它们保存在用户的设备上。 (比如queue pop操作......)

让我知道是否有更好的方法
看到接受的答案......

3 个答案:

答案 0 :(得分:1)

好一年后我再次需要这个,我找到了答案:

SQLiteOpenHelper中有一个静态方法可以在没有上下文的情况下打开数据库:openDatabase()

所以替换这个:

mDbHelper = new DBHelper(MainApplication.getContext());
db = mDbHelper.getWritableDatabase();

用这个:

db = SQLiteDatabase.openDatabase("path/to/database.db", null, OPEN_READWRITE);

静态方法openDatabase()不需要上下文,因此即使应用关闭,我们也可以调用它。

答案 1 :(得分:0)

创建一个扩展Service的类,并在onStartCommand()方法中执行数据库操作。同时在onMessageReceived

中启动该服务

答案 2 :(得分:0)

根据您的需要,您可以使用广播接收器。

首先,创建一个如下所示的广播接收器,

public class UpdateReceiver extends BroadcastReceiver {

    protected UpdateListener listener;

    public UpdateReceiver(UpdateListener listener) {

        this.listener = listener;
    }

    @Override
    public void onReceive(Context context, Intent intent) {

        if (intent == null || intent.getExtras() == null) {
            return;
        }
        if (intent.getBooleanExtra("message", false)) {
            listener.onMessage(intent.getStringExtra("messageText"));
        } 
    }

    public interface UpdateListener {


        public void onMessage(String message);

    }
}

然后让你的MainActivity实现这个接收器,比如

public class MainActivity implements UpdateReceiver.UpdateListener

您需要注册广播接收器,然后您可以在MainActivity中覆盖onMessage方法,然后您就可以在那里收到消息。

所以你的主要活动看起来像,

public class MainActivity  implements UpdateReceiver.UpdateListener {



    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        UpdateReceiver  chatMessageReceiver = new UpdateReceiver (this);
            registerReceiver(chatMessageReceiver, new       IntentFilter("messagereceived"));



    }

@Override
    protected void onMessage( String message) {

//do your DB Operations

    }

}

在您的onMessageReceived方法中,将此广播接收器称为

        Intent intent = new Intent();
        intent.setAction("messagereceived");
        intent.putExtra("message", true);
        intent.putExtra("messageText", "your message")
        getApplicationContext().sendBroadcast(intent);