2

アプリのアップデートをリリースしましたが、ユーザーから大量のエラーが発生しました。エラーを再現したり、問題を特定したりできません。

私が得ている2つのエラー: java.lang.IllegalStateException: attempt to re-open an already-closed object: SQLiteDatabase

java.lang.IllegalStateException: database not open

次のコードのどこかでエラーが発生しています。

public DBUserC getUser(int _id){
        synchronized (DBAdapter.LOCK){
            M.openDB(context);
            Cursor cursor = M.database.query(DBUserHelper.TABLE_USERS,
                    VUser.allColumns, DBUserHelper.COLUMN_ID + " = '"+_id+"'", null, null, null, null);
            DBUserC user;
            if (cursor.moveToFirst()){
                user = cursorToInfo(cursor);
            } else{
                user = newUser();
            }
            cursor.close();
            M.closeDB();
            return user;
        }
        }

このバージョンでは、データベースのアップグレードがあり、 を介して 3 つのクエリを実行しdb.execSqlます。別スレにはありません。

データベースを呼び出すたびに ( を除くonUpgrade)、同期して開き、コードを実行してから閉じます。このアップグレードまで問題はありませんでしたが、問題を見つけることができません。

どんな助けでも大歓迎です。

編集:データベースを開くには、次のようにします。

if (helper==null)
    helper = new DBAdapter(context);
if (database==null){
     database = helper.getWritableDatabase();
} else if (!database.isOpen())
     database = helper.getWritableDatabase();

そして閉じる:

helper.close();
helper = null;
database = null;

情報を取得する方法の例:

    public DBUserC getUser(int _id){
        synchronized (DBAdapter.LOCK){
            openDB(context);//this is the open code above
            Cursor cursor = M.database.query(DBUserHelper.TABLE_USERS,
                    VUser.allColumns, DBUserHelper.COLUMN_ID + " = '"+_id+"'", null, null, null, null);
            DBUserC user;
            if (cursor.moveToFirst()){
                user = cursorToInfo(cursor);//does not contain DB operations
            } else{
                user = newUser(); ////does not contain Database operations
            }
            cursor.close();
            closeDB();//This is the close code above
            return user;
        }
    }

AHost.onCreate

protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        M.initializeDB(context); //synchronized call to the openDB code I posted above
        M.openDataDB(context); //opens a different database by a different file name. This DB is not an issue

        //irrelevant ui setup
        int _id = pref.getInt(P.eLastUser, VUser.ID_NEW);//row id of user

        M.requeryUser();//synchronized, access database
        M.switchUser(_id);//synchronized, access database

    }
4

3 に答える 3

1

アプリの 1 つで同じ問題に直面しましたが、その問題をどのように解決したかは、cursor.close() を削除することです。それが役立つことを願っています:)

于 2014-01-21T08:48:42.653 に答える
0

テストでは DB バージョン 3 からバージョン 4 にアップグレードしていたため、問題を再現できませんでした。多くのユーザーがバージョン 2 からバージョン 4 にアップグレードしていました。2 から 3 にアップグレードするためのコードの一部はメソッドベースでした。バージョン 4 ではこれらのメソッドのいくつかを変更することになり、バージョン 3 のアップグレードが中断されました。次に、私が持っていたcursorToObject()メソッドからキャッチされた例外を取得していたため、database.closeがスキップされ、sqlite例外が発生しました

于 2014-01-18T08:41:49.307 に答える