我正在开发一个通过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()。?
答案 0 :(得分:1)
我没有看到您将数据保存到Sqlite
的原因,因为Firebase具有离线功能。
当没有网络时,数据可以缓存它自己。
它是最简单的。
答案 1 :(得分:0)
在相当严格的测试条件下更改并运行代码后,我可以确认从插入调用中删除close()解决了这个问题!
使用插入中的close(),应用程序会在大约95/100条消息中丢失并丢失其余消息,而如果没有它,则会收到100/100并记录在SQLite数据库中。
我认为这可能是因为getWritableDatabase()可以在消息事件处理服务(活动)中同时多次调用,而不必显式关闭。
如果情况并非如此和/或这是一个执行不力的解决方案,我很高兴得到纠正