Search code examples
androiddatabasesqliteandroid-studioandroid-sqlite

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


I am getting this only if user installs this app from play store, otherwise this issue doesn't appears. Even if we install app from apk file, and after seeing this issue clearing app data and cache removes this issue. My app is live on play store, I have to fix this as soon as possible.

this is my log

      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$25.onResponse(UserMainActivity.java:1240)
       at coms.inception.walayem.activities.user.UserMainActivity$25.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)

and this issue happens on places where I do any functionality related to database.

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

this line of code creates this exception,

database.tagDao().insertTags(tags);

Insert:

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

Solution

  • Update room_library version, in Database class solved the issue.. !!