【问题标题】:SQLite background insert from Firebase Messaging service来自 Firebase 消息服务的 SQLite 后台插入
【发布时间】:2017-06-08 11:34:12
【问题描述】:

我正在开发一个应用程序,该应用程序通过 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 助手中的插入

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();
}

有时我会收到此错误,通常是同时收到多条消息时出现:

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

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

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

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

【问题讨论】:

  • 你需要同步这个方法和其他正在使用数据库实例的方法...
  • Selvin 评论的背景是这个答案:stackoverflow.com/a/37562940/4815718
  • 谢谢大家。我读过那篇文章,这让我认为去掉 db.close() 可能会解决这个问题。我已经更新了我上面的问题。

标签: android sqlite firebase firebase-cloud-messaging


【解决方案1】:

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

Firebase Offline Capability

【讨论】:

  • OP 未使用 Firebase 数据库,而仅使用 Firebase 云消息传递。虽然使用 FCM + Firebase 数据库是一种可接受的组合,但单独使用 FCM 也是如此。
【解决方案2】:

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

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

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

如果不是这种情况和/或这是一个实施不善的解决方案,我很高兴得到纠正

【讨论】:

    猜你喜欢
    • 2021-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-25
    • 1970-01-01
    • 2020-05-15
    相关资源
    最近更新 更多