SQLiteDatabase-Fehler, nicht hilfreiches Protokoll

Ich habe ein Update meiner App veröffentlicht und bekomme eine Menge Fehler von den Benutzern. Ich kann es nicht neu erstellen oder das Problem nicht genau bestimmen.

Zwei Fehler, die ich erhalte:java.lang.IllegalStateException: attempt to re-open an already-closed object: SQLiteDatabase

java.lang.IllegalStateException: database not open

Der Fehler tritt irgendwo im folgenden Code auf:

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

In dieser Version gibt es ein Datenbank-Upgrade, bei dem ich über drei Abfragen durchführedb.execSql. Es ist nicht in einem separaten Thread.

Bei jedem Aufruf der Datenbank (außer imonUpgrade) Synchronisiere ich, öffne es, führe meinen Code aus und schließe es dann. Ich hatte bis zu diesem Upgrade keine Probleme und kann das Problem nicht finden.

Jede Hilfe wäre sehr dankbar.

BEARBEITEN: Um meine Datenbanken zu öffnen, mache ich:

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

und zum schließen:

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

Beispielmethode zum Abrufen von Informationen:

    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

    }

Antworten auf die Frage(3)

Ihre Antwort auf die Frage