我试图使用单例模式在整个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()
作为参数。