【发布时间】: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