致命异常:java.lang.IllegalStateException:尝试重新打开一个已经关闭的对象:SQLiteDatabase:

Fatal Exception: java.lang.IllegalStateException: attempt to re-open an already-closed object: SQLiteDatabase:

只有当用户从 Play 商店安装此应用程序时我才会收到此消息,否则不会出现此问题。即使我们从 apk 文件安装应用程序,并且在看到此问题后清除应用程序数据和缓存也会消除此问题。我的应用程序在 Play 商店上线,我必须尽快解决这个问题。

这是我的日志

      Fatal Exception: java.lang.IllegalStateException: attempt to re-open an already-closed object: SQLiteDatabase: /data/user/0/coms.inception.walayem/databases/walayem
       at android.database.sqlite.SQLiteClosable.acquireReference(SQLiteClosable.java:57)
       at android.database.sqlite.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java:1955)
       at android.database.sqlite.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java:1934)
       at androidx.sqlite.db.framework.FrameworkSQLiteDatabase.query(FrameworkSQLiteDatabase.java:161)
       at androidx.sqlite.db.framework.FrameworkSQLiteDatabase.query(FrameworkSQLiteDatabase.java:150)
       at androidx.room.RoomOpenHelper.hasRoomMasterTable(RoomOpenHelper.java:152)
       at androidx.room.RoomOpenHelper.checkIdentity(RoomOpenHelper.java:124)
       at androidx.room.RoomOpenHelper.onOpen(RoomOpenHelper.java:116)
       at androidx.sqlite.db.framework.FrameworkSQLiteOpenHelper$OpenHelper.onOpen(FrameworkSQLiteOpenHelper.java:151)
       at android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:504)
       at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:391)
       at androidx.sqlite.db.framework.FrameworkSQLiteOpenHelper$OpenHelper.getWritableSupportDatabase(FrameworkSQLiteOpenHelper.java:96)
       at androidx.sqlite.db.framework.FrameworkSQLiteOpenHelper.getWritableDatabase(FrameworkSQLiteOpenHelper.java:54)
       at androidx.room.RoomDatabase.beginTransaction(RoomDatabase.java:257)
       at coms.inception.walayem.database.TagDao_Impl.insertTags(TagDao_Impl.java:104)
       at coms.inception.walayem.activities.user.UserMainActivity.onResponse(UserMainActivity.java:1240)
       at coms.inception.walayem.activities.user.UserMainActivity.onResponse(UserMainActivity.java:1224)
       at com.android.volley.toolbox.JsonRequest.deliverResponse(JsonRequest.java:83)
       at com.android.volley.ExecutorDelivery$ResponseDeliveryRunnable.run(ExecutorDelivery.java:106)
       at android.os.Handler.handleCallback(Handler.java:883)
       at android.os.Handler.dispatchMessage(Handler.java:100)
       at android.os.Looper.loop(Looper.java:237)
       at android.app.ActivityThread.main(ActivityThread.java:8016)
       at java.lang.reflect.Method.invoke(Method.java)
       at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1076)

这个问题发生在我执行与数据库相关的任何功能的地方。

private void loadFilters() throws JSONException {

        JSONArray fields = new JSONArray();
        fields.put("name");
        fields.put("id");

        JSONArray domain = new JSONArray();

        JSONObject payload = JSONRPCParams.createReadJsonObject(WalayemApi.TAG,
                fields, domain, "id ASC");
        System.out.println("Outgoing json-->" + payload);
        WalayemRequest loadDetailsRequest = new WalayemRequest(
                WalayemApi.SEARCH_READ(),
                payload,
                new Response.Listener<JSONObject>() {
                    @Override
                    public void onResponse(JSONObject response) {
                        tags.clear();
                        System.out.println("Menu: load filters-->" + response);
                        try {
                            JSONObject resultObject = response.getJSONObject("result");
                            JSONArray dataArray = resultObject.getJSONArray("records");
                            for (int i = 0; i < dataArray.length(); i++) {
                                JSONObject tagObject = dataArray.getJSONObject(i);
                                Tag tag = new Tag(tagObject);
                                tags.add(tag);
                            }
                        } catch (JSONException e) {
                            e.printStackTrace();
                        }
                        try{


                            database.tagDao().insertTags(tags);
                        }
                        catch (Exception e){

                            SnackBarrghh.showMessage(UserMainActivity.this, e.getMessage());
                            e.printStackTrace();
                        }
                    }
                }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                System.out.println("Error-->menu filters--> " + error);
            }
        }, new WalayemRequest.SessionExpireListener() {
            @Override
            public void onSessionExpired() {
//                SessionExpiredDialog.show(UserMainActivity.this);
            }
        });
        RestClient.getInstance(this).addToRequestQueue(loadDetailsRequest);
    }

这行代码创建了这个异常,

database.tagDao().insertTags(tags);

插入:

@Dao
public interface TagDao {
    @Query("SELECT * FROM tag")
    List<Tag> getAll();

    @Query("SELECT * FROM tag WHERE id IN (:tagIds)")
    List<Tag> loadAllByIds(int[] tagIds);

    @Insert
    void insertAll(Tag... tags);

    @Delete
    void delete(Tag tag);

    @Query("DELETE FROM tag")
    void deleteAll();

    @Query("SELECT * FROM tag WHERE id = (:id)")
    Tag getTag(int id);

    @Query("SELECT COUNT(*) FROM tag")
    int getSize();

    @Insert(onConflict = OnConflictStrategy.REPLACE)
    void insertTags(List<Tag> tags);

    @Insert
    void insert(Tag tag);
}

更新 room_library 版本,在数据库中 class 解决了问题.. !!