我试图使用单例模式在整个Android应用程序中全局访问我的SQLite数据库:

public class MySQLiteOpenHelper extends SQLiteOpenHelper {
    private static final String DATABASE_NAME = "foo";
    private static final int DATABASE_VERSION = 1;
    private static MySQLiteOpenHelper instance;

    private MySQLiteOpenHelper(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
    }

    public static MySQLiteOpenHelper getInstance(Context context) {
        if (instance == null) {
            instance = new MySQLiteOpenHelper(context);
        }
        return instance;
    }

    public static MySQLiteOpenHelper getInstance() throws UnsupportedOperationException {
        if (instance == null) {
            throw new UnsupportedOperationException();
        }
        return instance;
    }

...


这里的想法是,第一个调用是对getInstance(Context context)的传入Application对象。此后,我只能使用getInstance()来获取Context对象的句柄。

但是,当我进行最初的MySQLiteOpenHelper.getInstance(getApplication())调用时,我感到很困惑:

java.lang.IllegalStateException: getDatabase called recursively
        at android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:204)
        at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:164)


任何人都可以对这里发生的事情有所了解,或者提出更好的技术来实现我的目标吗?

干杯!

最佳答案

您发布的代码很好。

java.lang.IllegalStateException: getDatabase called recursively


这是由于您在致电例如getWritableDatabase()递归地。

一个常见的原因是在数据库助手getWritableDatabase()中调用onCreate()。调用onCreate()且数据库不存在时,将调用getWritableDatabase()。再次调用getWritableDatabase()是错误。您应该使用传递给SQLiteDatabase的可写onCreate()作为参数。

10-08 15:29