从Firebase Messaging服务插入SQLite背景

时间:2017-01-23 20:36:10

标签: android sqlite firebase firebase-cloud-messaging

我正在开发一个通过Firebase消息传递数据的应用程序,将其插入到SQLite中并在应用程序中显示信息(如果可见)

首先,我在MANIFEST.XML

中设置了Firebase服务
    <!-- [START firebase_service] -->
    <service
        android:name=".MyHandler">
        <intent-filter>
            <action android:name="com.google.firebase.MESSAGING_EVENT"/>
        </intent-filter>
    </service>

接下来在MyHandler.java中我处理一个新的消息事件并在SQLite帮助器中调用insert

public class MyHandler extends FirebaseMessagingService {

SQLActivity dbsrv = new SQLActivity(this);

@Override
public void onMessageReceived(RemoteMessage remoteMessage) {

    dbsrv.crtMSG("SQ32 ETA 11:25");
    sendNotification("Flight update");
    if (MainActivity.isVisible) {
         MainActivity.mainActivity.SnackNotify("Flight update");
    }

这是我的SQLIte助手类

中的相关调用
public class SQLActivity extends SQLiteOpenHelper{

public void crtMSG(String sMSG) {
    SQLiteDatabase db = this.getWritableDatabase();
    ContentValues values = new ContentValues();
    values.put(MSGWRXF.MSGH.MSG, sMSG);
    db.insert("MSGH", null, values);
    db.close();
}

偶尔我会收到此错误,通常在同时收到多封邮件时会出现错误:

“Exception java.lang.IllegalStateException:无法执行此操作,因为连接池已关闭。”

不完全确定Firebase消息传递体系结构,但似乎消息传递事件如此快速地触发插入,以至于在连接关闭之前它们并未全部完成。

当消息一次到达时,此应用程序是否处于前台,后台和关闭状态,这绝对正常!即使设备在发送消息时切换它也可以正常工作,它们在再次打开时到达

我想知道是否可以在数据库插入中删除 db.close()。?

2 个答案:

答案 0 :(得分:1)

我没有看到您将数据保存到Sqlite的原因,因为Firebase具有离线功能。 当没有网络时,数据可以缓存它自己。 它是最简单的。

Firebase Offline Capability

答案 1 :(得分:0)

在相当严格的测试条件下更改并运行代码后,我可以确认从插入调用中删除close()解决了这个问题!

使用插入中的close(),应用程序会在大约95/100条消息中丢失并丢失其余消息,而如果没有它,则会收到100/100并记录在SQLite数据库中。

我认为这可能是因为getWritableDatabase()可以在消息事件处理服务(活动)中同时多次调用,而不必显式关闭。

如果情况并非如此和/或这是一个执行不力的解决方案,我很高兴得到纠正